извлечение значений из указателей в цикле - PullRequest
0 голосов
/ 30 сентября 2010

getLine - это функция, которая получает строку, я пытаюсь объединить строки вместе вне функции getLine. Всякий раз, когда я пытаюсь сделать это в цикле, это портит вывод. Могу поспорить, что это связано с указателями, но я потратил много часов, пытаясь выяснить это.

  int num;
  int matrix[370];

  i=1;
  j=0;
  while(*(point=getLine(infile)) != -2){ 
      n[j]=*point;
      if(n[0] != n[j]){
        printf("matrix dim error 1");
        break;
      }
      while (i<=n[j]){
        matrix[i+(3*j)] = *(point+(i+(3*j)));
        i++;
        printf("%d", matrix[i+(3*j)]);
      }
      printf("%d %d %d\n", matrix[1],matrix[2],matrix[3]);
      j++;
  }
  fclose( infile );
}

int *getLine(FILE *infile){

  int l=0;
  int line[7];
  int i=1;
  int *point;

  while ((l=getNum(infile)) != -1){
    if(l==EOF){
      line[0]=EOF;
      point = &line[0];
      return(point);
    }
    line[i]=l;
    i++;
  }
  if(i==1){
    line[0]=-2;
    point = &line[0];
    return(point);
  }
  line[0]=(i-1); //stores the length of the line in first space
  printf("%d %d %d\n",line[1],line[2],line[3]);
  point = &line[0];
  printf("%d\n",*point);
  return(point);
}

int getNum(FILE *infile) {
  int c=0;
  int value=0;


  while ((c=fgetc(infile)) != '\n') {
    if(c==EOF){
      return(EOF);
    }
    if((c==32)||(c==13)){
      if(value != 0){ //Making sure a number has been gotten
        //printf("%d\n\n", value);
        return(value);
      }
      //otherwise keep getting characters
    }
    else if ((c<=47)||(c>=58)){
      printf("incorrect number input %d\n", c);
      exit(1);
    }
    else {
      value = (10*value) + (c - '0');
    }
  }
  return(-1);//flags that the end of line has been hit
}

Ответы [ 2 ]

3 голосов
/ 30 сентября 2010

Есть одна проблема:

int *getLine(FILE *infile){
    int line[7];
    int *point;

    point = &line[0];
    return(point);
}

Вы возвращаете указатель на локальную переменную. Он становится недействительным, когда вы возвращаетесь из функции. Вместо этого вы можете разместить его в куче или позволить вызывающей стороне предоставить его в качестве аргумента.

0 голосов
/ 30 сентября 2010

Вместо

while (i<=n[j]){

Вы не имели в виду

while (i<=n[j][0]){

Подробнее Редактировать: Это действительно нормально, я пропускаю * в назначении.

Редактировать: Еще кое-что:

  • нет проверки, что диапазон int не превышен в getNum
  • нет проверки в getLine, что читается более 7 значений (чтоblow int line [7]
  • Матричный расчет, на мой взгляд, предполагает, что прочитано 3 значения, getLine может доставить до 7
  • matrix [i + (3 * j)] = * (point + (i + (3 * j))); ?? точка всего 7 int big !!!, поэтому для второго значения она будет читать за пределами определенных данных. Разве она не должна читать матрицу [i + (3 * j)] = точка[i];

hth

Марио

Кстати: я настоятельно рекомендую:

  • прибегнуть к функциям std-lib
  • лучшее именование (i и j в одном источнике настоятельно не рекомендуется)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...