Ядро сбрасывается при попытке создать newVector (массив 2D) в структуре - PullRequest
0 голосов
/ 19 декабря 2018

Итак, я пытаюсь создать простой массив 2D внутри структуры и прочитать значения некоторых координат в файле.

В этот момент у меня есть все внутренние функции, и яполучить ошибку сегментации, когда я пытаюсь получить координаты функции 'get_coords'.Если я пишу все тот же код на int main вместо использования функций, это работает.

code:

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

            // structure
            typedef struct coordinates{
                double **a;
            } coord;

            // counts the nmbr of points 
            int count(){
                int i;
                int a1, a2, a3;
                FILE *fp;
                fp = fopen("abc.txt", "r+");
                while (fscanf(fp, "%d %d %d", &a1, &a2, &a3) != EOF){
                    i++;
                    if (feof(fp)){
                        break;          
                    }   
                }
                fclose(fp);
                return(i);
            }

            // creates new structure with the right size of memory allocated
            coord *newVector(size_t s){
                coord *v;
                int j;
                v = malloc(sizeof(coord));

                v->a = malloc(sizeof(double*)*3);

                for (j=0; j<3; j++){
                    v->a[j] = malloc(sizeof(double)*s);
                }

            }

            void get_coords(coord *points){
                int i=0;
                FILE *fp;
                fp = fopen("abc.txt", "r+");
                while (fscanf(fp, "%le %le %le", &points->a[i][0], &points->a[i][1], &points->a[i][2]) != EOF){
                    i++;
                }
                fclose(fp);
            }


            int main(){
                int i = 0, j=0;

                coord *points;

                i = count();

                points = newVector(i);

                get_coords(points);

                for (i=0; i<3; i++){
                        printf("%lf %lf %lf\n", points->a[i][0], points->a[i][1], points->a[i][2]);
                }
            }

abc.txt:

1 2 3
4 5 6
7 8 9

Спасибо всем за помощь.

Кампс, Дилан.

PS: Это всего лишь прототип того, что я хочу.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы забыли вернуть v в newVector функцию:

        // creates new structure with the right size of memory allocated
        coord *newVector(size_t s){
            coord *v;
            int j;
            v = malloc(sizeof(coord));

            v->a = malloc(sizeof(double*)*3);

            for (j=0; j<3; j++){
                v->a[j] = malloc(sizeof(double)*s);
            }

            return v;

        }
0 голосов
/ 19 декабря 2018

В count() вы увеличиваете неинициализированную переменную , вызывая неопределенное поведение (UB).

Измените это:

int count() {
  int i;

на следующее:

int count() {
  int i = 0;

newVector() равно , а не , возвращая динамически выделенную память.

Измените это:

coord *newVector(size_t s) {
  ...
}

на следующее:

coord *newVector(size_t s) {
  ...
  return v;
}

После устранения этих проблем вы должны увидеть следующие выходные данные:

1.000000 2.000000 3.000000
4.000000 5.000000 6.000000
7.000000 8.000000 9.000000

Не проблема, но я бы использовал %lf в качестве спецификаторов формата вfscanf() вместо %le.

Более того, в count() этот return(i); совпадает с return i;.Скобки избыточны.

TODO: Освободить динамически выделенную память (я предполагаю, что вы пропустили эту часть для предоставления MCVE).


Pro-tip: Компилировать с включенными флагами предупрежденийв следующий раз.Они уже нашли бы проблему для вас в этом случае.В GCC, например, я бы получил это:

gsamaras@myPc:~$ gcc -Wall  main.c
main.c: In function ‘main’:
main.c:51:28: warning: unused variable ‘j’ [-Wunused-variable]
                 int i = 0, j=0;
                            ^
main.c: In function ‘newVector’:
main.c:37:13: warning: control reaches end of non-void function [-Wreturn-type]
             }
             ^

, где последнее предупреждение является вторым пунктом в моем ответе.

...