Я объявил массив:
char * words[1000] = {NULL};
И теперь у меня есть серия разветвленных дочерних процессов, добавляющих слова в этот массив, но они не влияют на родительскую программу. Как я могу это изменить?
Я объявил массив:
char * words[1000] = {NULL};
И теперь у меня есть серия разветвленных дочерних процессов, добавляющих слова в этот массив, но они не влияют на родительскую программу. Как я могу это изменить?
Хм, для вашего случая редактирования: не используйте fork, используйте потоки, потому что тогда все работает в одном адресном пространстве ...
И, конечно же, затем используйте мьютексы для защиты вашего массива слов ...
вы не добавили блок if внутри блока while !!!
while(i < 1000 && words[i] != NULL)
{
i++;
if(i<1000){
words[i] = (char*) malloc(strlen(temp)+1);
strcpy(words[i], temp);
words[i][strlen(words[i])] = '\0';
printf("Added: %s at location %d\n", words[i], i);
}
}
while
, который вы видите здесь, не является циклом while
, который выполняется десять раз. Этот оператор if
не должен находиться внутри цикла while
. Предполагается, что цикл while
найдет следующий открытый слот в массиве, а оператор if
добавляет слово в этот слот, если i <1000, т.е. если массив не заполнен.
- person temporary_user_name; 06.12.2012
Попробуйте это, у вас неправильные фигурные скобки:
int i = 0;
while(i < 1000 && words[i] != NULL){
i++;
if(i<1000){
words[i] = (char*) malloc(strlen(temp)+1);
strcpy(words[i], temp);
words[i][strlen(words[i])] = '\0';
printf("Added: %s at location %d\n", words[i], i);
}
}
Пожалуйста, вставьте весь код ... Я написал код, чтобы делать то, что, как мне кажется, вы делаете, и у меня это сработало ...
#include <stdio.h>
int main(int argc, char *argv[])
{
char* words[1000];
int j;
for(j = 0; j<1000; j++)
words[j] = NULL;
char *temp = "dummy";
for (j = 0; j < 10; j++)
{
int i = 0;
while(i < 1000 && words[i] != NULL)
i++;
printf("Adding something to %d vs %d\n",i,j);
if(i<1000){
words[i] = (char*) malloc(strlen(temp)+1);
strcpy(words[i], temp);
words[i][strlen(words[i])] = '\0';
printf("Added: %s at location %d\n", words[i], i);
}
}
}
/* prints:
Adding something to 0 vs 0
Added: dummy at location 0
Adding something to 1 vs 1
Added: dummy at location 1
Adding something to 2 vs 2
Added: dummy at location 2
Adding something to 3 vs 3
Added: dummy at location 3
Adding something to 4 vs 4
Added: dummy at location 4
Adding something to 5 vs 5
Added: dummy at location 5
Adding something to 6 vs 6
Added: dummy at location 6
Adding something to 7 vs 7
Added: dummy at location 7
Adding something to 8 vs 8
Added: dummy at location 8
Adding something to 9 vs 9
Added: dummy at location 9
*/
когда вы создаете дочерний элемент с помощью fork, каждый дочерний элемент получает свою собственную копию массива, когда дочерний элемент что-то меняет в массиве, он фактически изменяет свою собственную копию, для того, что вы пытаетесь сделать, вам нужна межпроцессная связь (IPC), вам нужно создать разделяемую память или создайте канал, чтобы значения массива изменялись для всех дочерних и родительских
char* words[1000] = {NULL};
, и каждый элемент в массиве будет установлен наNULL
. - person Cornstalks   schedule 06.12.2012words[i][strlen(words[i])] = '\0';
. Вы уже знаете, какова длина строки (отstrlen(temp
), поместите NUL в нужное место. - person Michael Foukarakis   schedule 06.12.2012words[i]=strdup (temp)
- person pbhd   schedule 06.12.2012