Ошибка сегментации при вводе матрицы - PullRequest
0 голосов
/ 27 декабря 2018

Итак, мне нужно создать программу, которая, когда пользователь вставляет таблицу, должна отправлять в вывод только границу таблицы.Я использовал матрицу для ввода, но когда пользователь заканчивает ввод, программа останавливается, и я получаю ошибку сегментации.

#include <stdio.h>
#define VAL 50

void inputMatrice(int m[VAL][VAL], int *ncol, int *nrig);
void bordi(int m[][VAL], int ncol, int nrig, int v[], int *nv);
void outputVettore(int v[], int nv);

int main(){
    int m[VAL][VAL], v[VAL], *ncol, *nrig, nc, nr, nv;
    ncol = &nc;
    nrig = &nr;
    inputMatrice(m, ncol, nrig);
    nv=0;
    printf("ciao");
    bordi(m, nc, nr, v, &nv);
    outputVettore(v, nv);

}
/*Funzione per input matrici*/

void inputMatrice(int m[VAL][VAL], int *ncol, int *nrig){

    int i=0, j=0;
    printf("Inserisci il numero di righe: ");
    scanf("%d", nrig);
    printf("Inserisci il numero di colonne: ");
    scanf("%d", ncol);
    for(i=0;i<*nrig;i++){
        for(j=0;j<*ncol;j++){
            printf("Inserisci i valori della tabella nella posizione %d,%d: ", i+1, j+1);
            scanf("%d", &m[i][j]);
        }
    }
}

void bordi(int m[][VAL], int ncol, int nrig, int v[], int *nv){
    int i=0, j=0, k=0;
    for(j=1; j<ncol; j++){
        v[k]=m[i][j];
        *nv++;
    }
    for(i=1;i<nrig;i++){
        v[k] = m[i][j];
        *nv++;
    }
    for(j=(ncol-1); j>0; j++){
        v[k]=m[i][j];
        *nv++;
    }
    for(i=(nrig-1); j>0; i++){
        v[k]=m[i][j];
        *nv++;
    }
}
void outputVettore(int v[], int nv){
    int i=0;
    for(i=0;i<nv;i++){
        printf("|%d|", v[i]);
    }

}

Извините за итальянский вывод и за плохой английский.

Ответы [ 3 ]

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

Ошибка возникает в функции void bordi(int m[][VAL], int ncol, int nrig, int v[], int *nv).

Исправлены условия 3-го и 4-го for цикла.Вы увеличили j в первом цикле, но не уменьшили или не установили его на 0, так что вы получите бесконечный цикл.

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

Проблема в функции bordi().Посмотрите на этот for цикл:

for(j=(ncol-1); j>0; j++){
    v[k]=m[i][j];
    *nv++;
}

Переменная управления цикла j инициализируется с помощью ncol-1 и проверяет условие j>0.После выполнения операторов цикла значение j будет увеличено на 1 (j++).Таким образом, условие цикла j>0 всегда будет true [до тех пор, пока j не переполнится] и после нескольких итераций ваша программа начнет обращаться к недопустимому значению массива m (m[i][j]), которое вызываетошибка сегментации.

Чтобы устранить эту проблему, замените j++ на j-- в цикле.

Та же проблема существует и в следующем цикле for, но в немного другомway:

for(i=(nrig-1); j>0; i++){
    v[k]=m[i][j];
    *nv++;
}

здесь, в условии цикла вы используете переменную j.
В этом цикле for необходимо сделать два изменения.

for(i=(nrig-1); i>0; i--){
                ^^   ^^
0 голосов
/ 27 декабря 2018

Строка в вашей программе *nv++; увеличивает указатель, что совершенно неверно в логике, попробуйте увеличить значение.то есть попробуйте: - (*nv)++;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...