2015-03-13 3 views
-1

Входной файл для моей программы имеет первую строку, содержащую int (назовите ее N), которая будет означать, сколько будет следующих целых чисел (каждое целое число в новой строке). Затем он должен прочитать целые числа в num_array и распечатать их. Моя проблема в том, что num_array не выделяется должным образом, я думаю. Операторы отладки в коде будут печатать 8 как sizeof (num_array) независимо от того, что N.C проблема с динамически распределяющим массивом

#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h> 

int *num_array; 

int main (int argc, char**argv){ 
    int numThreads = (int) argv[1]; 
    char *inputFile = argv[2]; 
    int N = 0; 

    char line[20]; 
    FILE *file = fopen(inputFile, "r"); 

    int fileCounter = 0; 

    while(fgets(line, sizeof(line), file)) { 
     if (fileCounter==0){ 
      N = atoi(line); 
      num_array = malloc(sizeof(int)*(N+1)); 
     } 
     else{ 
      num_array[fileCounter-1] = atoi(line); 
     } 
     fileCounter++; 
    } 
    fclose(file); 
    int i; 

    printf("%d", sizeof(num_array)); 
    printf("\n"); 
    printf("\n"); 
    for(i = 0; i<sizeof(num_array); i++){ 
     printf("%d\n", num_array[i]); 
    } 
    return 0; 
} 

Пример ввода файла:

9 
10 
9 
3 
212 
56 
99 
4 
5 
6 

напечатает:

8 
10 
9 
3 
212 
56 
99 
4 
5 

Как вы можете видеть, последний элемент массива отсекается (не печатает 6) и кажется, что num_array не подбирается правильно (должно содержать N целых чисел, где N - это int в первой строке входного файла)

ответ

3

Много проблем с программой:

  1. Первая строка вашего main() функции имеет очень серьезную ошибку

    int numThreads = (int) argv[1] 
    

    в С литьем не преобразует тип, это преобразование, конечно, возможно, но не дает результата вы ожидаете, что вам нужно что-то вроде этого

    char *endptr; 
    int numThreads = strtol(argv[1], &endptr, 10); 
    if (*endptr != '\0') 
    { 
        printf("`%s' cannot be converted to an integer\n", argv[1]); 
        return -1; 
    } 
    
  2. вы не убедитесь, что был параметр, переданный в командной строке вашей программы, вам нужно проверить, что argc содержит количество аргументов командной строки, переданных программе + в argv[0], так что вы должны проверить

    if (argc < 2) 
    { 
        printf("Use: %s NumberOfThreads, where NumberOfThreads is `int'\n", argv[0]); 
        return -1; 
    } 
    
  3. Вы не проверяют если fopen() возвращает NULL, это вызовет больше проблем, если вы fgets() указатель file.

  4. Оператор sizeof не дает длину массива дает число байтов, занимаемых массивом, и переменная не является массивом, это указатель, так sizeof оператор в этом случае дает размер указателя.

    Оказывается, что ваш файл содержит 9 значения и в вашей платформе размер указателя 8, так sizeof(num_array) является 8 что 9 - 1 поэтому ваш не хватает одного значения, у вас уже есть количество элементов массива N, так используй это.

  5. Вы никогда не звоните free().

Это версия кода, это фиксируется, и это безопаснее

#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h> 

int *num_array; 

int main (int argc, char**argv) 
{ 
    char line[20]; 
    /*int numThreads = 1;*/ 
    char *inputFile = "data.dat"; 
    int N   = 0; 
    int fileCounter = 0; 
    int i   = 0; 
    FILE *file = fopen(inputFile, "r"); 
    if (file == NULL) 
     return -1; 
    while (fgets(line, sizeof(line), file) != NULL) 
    { 
     if (fileCounter == 0) 
     { 
      N   = atoi(line); 
      num_array = malloc((1 + N) * sizeof(int)); 
      if (num_array == NULL) 
      { 
       fclose(file); 
       return -1; 
      } 
     } 
     else 
     { 
      num_array[fileCounter - 1] = atoi(line); 
     } 
     fileCounter++; 
    } 
    fclose(file); 

    printf("%ld", sizeof(num_array)); 
    printf("\n"); 
    printf("\n"); 
    for (i = 0 ; i < N ; i++) 
    { 
     printf("%d\n", num_array[i]); 
    } 
    free(num_array); 
    return 0; 
} 
+0

изменили его в целое numThreads = atoi (ARGV [1]) и по-прежнему получать тот же результат – GregH

+0

@jeremy мой ответ не говорит, что он исправит вашу проблему, я стараюсь найти проблему, но вы должны публиковать образцы данных из своего файла и не использовать 'atoi()' это не очень полезно, потому что вы не можете выполните любую проверку ошибок. –

+0

@jeremy nevermind Я просто нашел образец входного файла. –

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