LINUX.ORG.RU

Ответ на: комментарий от anonymous

И, да, это при условии, что последний указатель в списке будет NULL/

anonymous
()

Можно в стиле итераторов

char** i = stringsArray;
const char** end = stringsArray + stringsArraySize;

for(;i!=end;++i)
{
   char* some_string = *i;
}

pathfinder ★★★★
()
Последнее исправление: pathfinder (всего исправлений: 2)
Ответ на: комментарий от Sorcerer

Слушай этого анонимуса. Код остальных комментаторов нерабочий.

О работоспособности или неработоспособности говорить не приходится. ТС точно не указал как организован в памяти массив строк. То, что в этом массиве последний элемент - холостой NULL, это догадка.

pathfinder ★★★★
()
Ответ на: комментарий от former_anonymous

Блеан а я думал там указатели как в ассемблере. Да и юзал только char.

linuhs_user
()
Последнее исправление: linuhs_user (всего исправлений: 1)
Ответ на: комментарий от Sorcerer

тьфу, const не туда поставил

char** i = stringsArray;
char** const end = stringsArray + stringsArraySize;

for(;i!=end;++i)
{
   char* some_string = *i;
}

pathfinder ★★★★
()

Точно не так. Как хранится информация о размере массива? Известен его размер? Если да, то в compile time или runtime? Если первое то sizeof, если второе то у тебя должна быть отдельная переменная с размером. Или он содержит терминатор в конце? Если да, но какой? NULL, пустая строка?

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Какая переменная с размером? Там массив указателей на null-terminated-строки.

Прибавляющие sizeof тоже доставляют.

anonymous
()
Ответ на: комментарий от anonymous

О, недогадалки подтянулись. А что массив указателей на null-terminated строки можно выделить на куче, и что строк там может быть меньше чем выделено элементов, и что в первом посте ничего про это не сказано ты конечно не подумал? Хрустальный шар ведь мозг не заменяет.

slovazap ★★★★★
()
Ответ на: комментарий от Waterlaz
main:
    mov eax, stringArray
    .while:
        mov ebx, [eax]
        cmp ebx, 0
            je .while_end  

        push ebx
        call puts
  
        add eax, 4 ; Вот должно быть так, но делается add eax, 4*4
        jmp .while
    .while_end
    ret

stringArray:
    dd str0
    dd str1
    dd str2
    dd 0

str0: 
    db "Array element 1", 0

str1: 
    db "Array element 2", 0

str2: 
    db "Array element 3", 0
linuhs_user
()
Последнее исправление: linuhs_user (всего исправлений: 4)
Ответ на: комментарий от linuhs_user

add eax, 4

Какой сейчас год? 1998? 64х ОСи еще не изобрели? Просто у нас тут в кк18 32хбитных считай и не осталось вовсе, даже на тостеры 64 ставят.

PPP328 ★★★★★
()
Ответ на: комментарий от Waterlaz

Написал на тебя донос.

Доступ к запрашиваемому ресурсу ограничен!
 
Возможные причины:

По требованию правоохранительных органов в соответствии с законодательством и/или на основании решения суда.

Адрес сайта внесён в Единый Реестр доменных имен сайтов, содержащих информацию, распространение которой в Российской Федерации запрещено. 
Получить данные о нахождении в Едином реестре запрашиваемого вами ресурса можно на сайте http://eais.rkn.gov.ru

Адрес сайта внесён в Реестр доменных имен сайтов, содержащих информацию, распространяемую с нарушением исключительных прав. 
Получить данные о принятии мер по ограничению доступа к информационным ресурсам можно на сайте http://nap.rkn.gov.ru/reestr

linuhs_user
()
Ответ на: комментарий от linuhs_user

В итоге у тебя в цикле будет пробегать индекс stringsArray[i*sizeof(char*)] а должен просто i, так как при разыменовании и так делается поправка на тип массива.

anonymous
()

Си...

Неужели он настолько неодназначен этот ЯП Си, что простой вопрос вызывает столько неоднозначных ответов?

le_legioner ★★
()
Ответ на: Си... от le_legioner

простой вопрос вызывает столько неоднозначных ответов

ТС просто затроллил мамкиных программистов, не указав размер массива и вообще, как он устроен.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

Это не массив строк, а указатель на указатель на char.

lovesan ★★
()
Ответ на: Си... от le_legioner

Была тема на 10 страниц по соединению строк.

linuhs_user
()
Ответ на: комментарий от Sorcerer

А если две строки?

Сделал так:

int counte = 0;
while(*stringsArray){
....
  ++stringsArray;

   counte++;
}
printf("%d\n", counte);

Получаю что если в *stringsArray и *stringArray2 по 18 элементов после цикла count = 32!

А после цикла:

int counte = 0;
while(*stringsArray && *stringsArray2){
....
  ++stringsArray;
  ++stringsArray2;
   counte++;
}
printf("%d\n", counte);

count = 24 Что??? 0_o

sniper21 ★★★★★
() автор топика
Последнее исправление: sniper21 (всего исправлений: 1)
Ответ на: комментарий от sniper21

У тебя точно последним элементом обоих массивов идет NULL? Если где-то просрал, вполне может такое получиться (пока не станешь разыменовывать или не влезешь в чужой блок памяти).

anonymous
()
Ответ на: комментарий от sniper21

Если у тебя список не кончается NULL, то каким хреном ты собираешься найти его конец, проверяя каждую строку на равенство NULL?

Вот же ядрен батон!

anonymous
()
Ответ на: комментарий от sniper21

Можно сделать вот так:

char ** formlist(int N){
  return calloc(N*sizeof(char*));
}
Далее заполняем:
char **list = formlist(N), **elem = list;
for(int i = k; i > 0; --i) *elem++ = strdup(что-то); // k > N-1
Все, у тебя автоматом NULL последним элементом. Если же надо увеличить размер (realloc), не забудь добавить последним NULL:
char **resize_list(char **old, int oldsize, int newsize){
  char **list = realloc(old, newsize*sizeof(char*));
  // проверка list на !NULL
  list[oldsize] = NULL;
}

anonymous
()
Ответ на: комментарий от anonymous
char **lines;
long prevPos = 0;
long currentLine = 0;

lines = malloc(linesCount * sizeof(char *));
for (unsigned int i = 0; i < strlen(length_of_string); i++) {
    lines[currentLine] = malloc(i - prevPos + 1);
    memcpy(lines_down[currentLine], &length_of_string[prevPos], i - prevPos);
    currentLine++;
}

for (int i = 0; i < linesCount; i++) {
    printf("%s\n", lines[i]);
}

Я вот так заполняю массив по примеру.

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от sniper21

Ну вот, ты не оставляешь нулевого элемента, поэтому не имеешь права сканировать массив проверкой на !NULL. Делай это в цикле по количеству строк в массиве.

anonymous
()
Ответ на: комментарий от anonymous

А как добавить NULL для этого кода?

char **lines;
long prevPos = 0;
long currentLine = 0;

lines = malloc(linesCount * sizeof(char *) + 1); // добавим сюда +1 для NULL
for (unsigned int i = 0; i < strlen(length_of_string); i++) {
    lines[currentLine] = malloc(i - prevPos + 1);
    memcpy(lines_down[currentLine], &length_of_string[prevPos], i - prevPos);
    currentLine++;
}
// а тут что добавить ?

***** = NULL;

for (int i = 0; i < linesCount; i++) {
    printf("%s\n", lines[i]);
}

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от sniper21

Замени malloc на calloc, либо делай memset(0), либо просто после инициализации делай lines[linesCount] = NULL.

anonymous
()
Ответ на: комментарий от anonymous

либо просто после инициализации делай lines[linesCount] = NULL.

После инициализации чего: malloc? Так?

lines = malloc(linesCount * sizeof(char *) + 1); // добавим сюда +1 для NULL

lines[linesCount] = NULL

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от sniper21

ну так я тебе сообщаю, что у тебя нет массива строк. у тебя просто указатель куда-то в память, и тебе никто не обещает что там обязательно лежит массив строк.

тебе надо его сперва создать. сам массив то есть и он заполнен чем? хероборой он заполнен. потом тебе надо его заполнить строками, создав их. потом тебе стоит либо указать где-то колво строк, либо в последнюю строку вписать NULL. в последнем случае надо создавать массив на 1 длиннее чем у тебя строк есть. и удалять это всё придется вручную, сперва сами строки а потом массив строк.

И наверно тебе лучше воспользоваться Qt и конкретным классом QStringList. где всё сделали за тебя.

ckotinko ☆☆☆
()
Ответ на: комментарий от ckotinko

Спасибо я уже воспользовался std::string и std::vector, где всё сделали за меня, теперь я воспользуюсь истоками бытия.

sniper21 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.