Строки В Массиве

Тема в разделе "Общие вопросы по С и С++", создана пользователем Pingvin1, 10 фев 2015.

  1. Pingvin1

    Pingvin1 Well-Known Member

    Регистрация:
    20 июл 2009
    Сообщения:
    50
    Симпатии:
    0
    Как узнать количество элементов в массиве, *char или string массив организован без применения вектора?
    Для справки: в массиве string методы с применённые к следующему за последним элементом в Dev 5 C++ аля Visual Studio метод Имя_массива_string.empty() даёт false, а метод Имя_массива_ string.Length() даёт 3.
     
  2. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    лично я не знаю способа, и не нашёл, хотя честно пытался)

    можно ли узнать для чего вам это надо сделать?
     
  3. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    У string есть метод length (и size) - он возвращает длину, что вам надо?
    если у вас имеется лишь указатель на массив (char) - то узнать длину никак нельзя. Указатель лишь содержит адрес начала массива в памяти. Размер массива вы должны знать сами, вы ведь выделяли для него памяти?

    Таки да, при выделении памяти в начадо блока помещается информация для ее корректного освобождения (обычно прямо перед областью, в которую вы будете записывать свой массив), но стандарт языка не регламентирует это, я думаю оно очень сильно отличается для разных компиляторов и операционных систем - не стоит на него опираться.

    И да, аллокация отличается не только от компилятора. Функция malloc находится в хедере типа stdlib,. но может исопльзоваться что-то другое. Например компилятор микрософта исопльзует разные функции аллокации при отладке программы и релизе. При поиске утечек интсрументы типа VLD заменяют стандартный malloc и free. Наконец, malloc и free - это замечательно и низкоуровнево, но классы в C++ возволяют перегружать оператор выделения/освобождения памяти (new и delete) и если мне памяти не изменяет, можно там и аллокацией управлять.

    А еще, вы можете выделить память по указателю ptr, а передать (ptr+1) (это такой же char*). Естественно перед ним не будет никакой информации о размере массива.

    Т.е. размер массива, имея указать узнать никак нельзя.

    МБ я вопрос не понял, но я пытался собрать ваши слова в предложения.
     
  4. Pingvin1

    Pingvin1 Well-Known Member

    Регистрация:
    20 июл 2009
    Сообщения:
    50
    Симпатии:
    0
    Whatka> можно ли узнать для чего вам это надо сделать?
    Чтобы для себя узнать количество элементов в массиве при отладке, наподобие print_r – php.
    Для r04- я по ошибке часть своего вопроса тут разместил, вот продолжение:
    Для справки: в массиве string методы с применённые к следующему за последним элементом в Dev 5 C++ аля Visual Studio метод Имя_массива_string.empty() даёт false (то есть: есть строка – не правильно), а метод Имя_массива_ string.Length() даёт 3.
     
  5. Pingvin1

    Pingvin1 Well-Known Member

    Регистрация:
    20 июл 2009
    Сообщения:
    50
    Симпатии:
    0
    Следующим элементом массива string идёт следующий элемент массива string или следующая переменная string, если ни чего нет, то комп виснет. Значит, если Вам надо определить количество элементов строк, надо использовать не массив, а вектор.

    Ниже я привожу код, который может использоваться при отладке, для вывода всех элементом строчного вектора или заданных элементов строчного массива:


    Код (C++):

    void fnPrintSVekt (vector< string > rsText)  {//Выводит количество элементов в векторе строк и значения, требует наличия #include <vector> в файле

      charszBuf[2000],szTmp[200];//размер всего печатающего буфера и элемента

      int iKolEl;



      iKolEl=rsText.size();

      sprintf (szBuf,"Количество элементов вектора %d\n",iKolEl);

      for (int i=0;i<iKolEl;i++)  {

      sprintf (szTmp," (%d) %s-%d",i+1,rsText[I].c_str(),rsText[I].length());

      strcat (szBuf,szTmp);  }

    #if defined (DOS)

      strcat (szBuf,"\n");//Для DOSдобавляется перевод строки

    #endif

      fnOtlPrintf ("%s",szBuf); //универсальная печать для DOS и Windows



      }

    void fnPrintSMass (string sText[],int iKolEl)  {//Выводит количество элементов в массиве строк и значения, ни как не может определить количество элементов, требует наличия какого-то #include ... в файле

    //  extern string sText;-принахождениивудаленномфайле,восновномфайле [Error] variable or field 'fnPrintSMass' declared void и [Error] 'string' was not declared in this scope

      char szBuf[2000],szTmp[200];



      sprintf (szBuf,"Заданноколичествоэлементов string %d\n",iKolEl);//количествоэлементовстрочногомассива

      for (int i=0;i<iKolEl;i++)  {

      sprintf (szTmp," (%d) %s-%d",i+1,sText[I].c_str(),sText[I].length());

    strcat (szBuf,szTmp);

      }

    #if defined (DOS)

      strcat (szBuf,"\n");//Для DOSдобавляется перевод строки

    #endif

      fnOtlPrintf ("%s",szBuf);//универсальная печать для DOS и Windows

      }



    voidfnOtlPrintf(char *pszFormat,...)  {//универсальная печать для DOS и Windows с функционалом printf, работает в другом файле

      static int iNomer=1;

      char szCaption[]="Отладочное окно",szBuffer [9000];

      char *pArguments;

      pArguments =(char *)&pszFormat + sizeof(pszFormat);//указывает на следующую переменную за форматом

      vsprintf(szBuffer, pszFormat, pArguments);//в буфер помещает в соответствии с форматом аргументы, Действие функции vsrintf() эквивалентно действию функции spsintf(), но список аргументов заменен указателем на список аргументов. Этот указатель должен иметь тип char* или va_list, который определен в заголовке <stdarg.h>.

    #if defined (DOS) //#define DOS #else #endif

      printf ("%s",szBuffer);//\n

    #else

      sprintf(szCaption, "%s %d",szCaption, iNomer);

      iNomer++;

      MessageBox(NULL, szBuffer, szCaption, MB_OK);//WS_VSCROLL|SB_CTL

    #endif

      }
     
    Когда вывод на экран при DOS включите: #define DOS иначе закомментируйте. Данные функции работают только в главном файле иначе две ошибки: Тип string неизвестен и Пустая функция 'fnPrintSMass', это приходится учитывать.

    Полный рабочий пример: http://pingvin.besaba.com/2_pr_for_dos_string.cpp

    А это подарок всем и их половинкам ко дню всех влюблённых http://zrenieostro.com/links/valentinka.php[/I][/I][/I][/I]
     
  6. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    @Pingvin1, Скажи зачем это. Я думаю, что таких трюков надо избегать. Если они тебе нужны - скорее всего ты делаешь что-то неправильно.
     
  7. Pingvin1

    Pingvin1 Well-Known Member

    Регистрация:
    20 июл 2009
    Сообщения:
    50
    Симпатии:
    0
    rrrFer >Скажи зачем это. Я думаю, что таких трюков надо избегать.
    Это получение стандартной функции, для отладки, иногда без такой функции отладить программу проблематично.
     
  8. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Приведи, пожалуйста пример (как можно проще), когда отладка без этого не получается. Я таких случаев в своей жизни не видел.
     
  9. Pingvin1

    Pingvin1 Well-Known Member

    Регистрация:
    20 июл 2009
    Сообщения:
    50
    Симпатии:
    0
    Я не давно программирую на С++, только 2 раза у меня возникло желание использовать эту функцию, но в php довольно часто использовал аналогичную функцию print_r, может и можно без неё отладить, но это точно более трудоёмко.

    Ну никак у меня в Wincows 8.1 не выполнялась написанная программа из Планировщика Заданий, а в 7 работала, оказалось что 8 работает только с проектами WIN32.
     
Загрузка...

Поделиться этой страницей