2015-07-17 5 views
0

Я продолжаю получать RUNTIME ERROR при попытке передать вход [i] другой функции ... Не знаю, почему. Он должен передать адрес ввода [i] другому указателю в другой функции, поэтому я не знаю, где он поступил неправильно. Это должно быть что-то очень простое, что я не смог поймать ...Простая передача указателя на другую функцию FAILED

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

void processInfixExp(const char * fileName) 
{ 
    char ** input = NULL, ** output = NULL; 
    int i = 0, numInput = 0; 
    char len; 
    char tempInput[100] = {0}; 
    FILE * pFile = NULL; 
    if((pFile = fopen(fileName, "r")) == NULL) 
    { 
     printf("Cannot read file %s\n", fileName); 
     system("PAUSE"); 
     exit(1); 
    } 
    while(fgetc(pFile) == '\n') 
     ++numInput; 
    /* printf("%d\n", numInput); */ 
    input = (char**)malloc(numInput * sizeof(char*)); 
    output = (char**)malloc(numInput * sizeof(char*)); 
    if(!input || !output) 
    { 
     printf("Memory allocation failed.\n"); 
     system("PAUSE"); 
     exit(1); 
    } 
    rewind(pFile); 
    for(i = 0; fgets(tempInput, MAXL, pFile) != NULL; ++i) 
    { 
     /* printf("%s\n", tempInput); */ 
     len = strlen(tempInput); 
     while(len && tempInput[len-1]) 
      tempInput[len-1] = '\0'; 
     input[i] = strdup(tempInput); 
     printf("%s\n", input[i]); /* PRINTF SUCCESS */ 
    } 
    fclose(pFile); 
    for (i = 0; i < numInput; ++i) 
    { 
     convertIntoPost (input[i], &output[i]); 
     printf (" input[%2zu]: %-25s output[%2zu]: %s\n", i, input[i], i, output[i]); 
    } 
    free(input), free(output); 
} 
void convertIntoPost(char * in, char ** out) /* TEST PASSING input[] */ 
{ 
    printf("%s", in); /* NO SUCCESS */ 
} 
+2

Приятно ли подсчитывать количество последовательных строк новой строки в начале файла? Вы должны просмотреть цикл: 'while (fgetc (pFile) == '\ n') ++ numInput;' Вы также должны научиться запускать отладчик и/или узнать, как печатать значения ключа при прохождении программы , Глядя на 'numInput', вероятно, вы увидите значение 0, указывающее на проблему. «Любопытно, что вы показываете печать для« numInput », но вы не комментируете полученный результат. –

+1

'while (len && tempInput [len-1]) tempInput [len-1] = '\ 0';' также интересен. –

+0

Этот цикл также любопытен: 'while (len && tempInput [len-1]) tempInput [len-1] = '\ 0';' - это, вероятно, должно быть 'if', так как вы не настраиваете' len 'в цикле, поэтому после первой итерации условие должно быть ложным. –

ответ

1

Похоже convertIntoPost ожидается назначить output[i] по indirecting через параметр out, что он получает. Если вам не удалось добавить эту часть, вам все равно нужно инициализировать указатель, чтобы printf в вызывающем абоненте преуспел.

void convertIntoPost(char * in, char ** out) /* TEST PASSING input[] */ 
{ 
    printf("%s", in); /* NO SUCCESS */ 
    *out = strdup(""); 
} 

Кроме того, перед вами free(input) и free(output), вам нужно освободить все строки, которые они указывают, в противном случае они будут потеряны.

for (i = 0; i < numInputs; i++) { 
    free(input[i]); 
    free(output[i]); 
} 
free(input); 
free(output); 
+0

Спасибо, Бармар! Это очень важно, и я пропустил это. –

Смежные вопросы