Strona 1 z 1

[c][solved] Błąd:segmentation fault, sumowanie macierzy

: 16 lut 2009, 01:17
autor: witcher23
Witam, mam pewien problem z moim programem:
//Program sumujący dwie macierze
#include<stdio.h>
#include<iostream>
void suma(int **A, int **B, int wierszA, int wierszB, int kolumnaA, int kolumnaB);

int main(void)

{
int w, k;
int wierszA, wierszB, kolumnaA, kolumnaB;
int **A, **B;

printf("Podaj wymiar macierzy A(np 3x3): ");
scanf("%dx%d", &wierszA, &kolumnaA);

printf("Podaj wymiar macierzy B(np 3x3) :");
scanf("%dx%d", &wierszB, &kolumnaB);

srand (time (NULL));

for(k=0; k<wierszA; k++) {
for(w=0; w<kolumnaA; w++){ *(*(A+w)+k) = rand()%10;
}
}

for(k=0; k<wierszB; k++){
for(w=0; w<kolumnaB; w++){ *(*(B+w)+k) = rand()%10;
}
}
puts("Macierz A:\n");
for (k=0; k<wierszA; k++) {
for (w=0; w<kolumnaA; w++) printf("%i ", *(*(B+w)+k));
printf("\n");

}
puts("Macierz B:\n");
for (k=0; k<wierszB; k++) {
for (w=0; w<kolumnaB; w++) printf("%i ", *(*(B+w)+k));
printf("\n");
suma(A, B, wierszA, wierszB, kolumnaA, kolumnaB);
}
return 0;

}//koniec funkcji main

void suma(int **A, int **B, int wierszA, int wierszB, int kolumnaA, int kolumnaB)
{
if((wierszA==wierszB)&&(kolumnaA==kolumnaB))
{
int w, k;
printf("\nSuma macierzy A i B:\n");
for (k=0; k<wierszA; k++) {
for(w=0; w<kolumnaA; w++) printf("%i", *(*(A+w)+k) + *(*(B+w)+k));
printf("\n");
}
}
else {printf("\nNiezgodność wymiarów macierzy\n");
}
}//koniec funkcji suma

Po uruchomieniu programu pojawia mi się błąd, zaraz po tym jak podam wymiary odpowiednich macierzy.

Pozdrawiam

Odp: Błąd: Segmentation fault

: 16 lut 2009, 01:33
autor: Hauleth
bo nie masz określonych rozmiarów macierzy.

PS
po co inkludujesz i iostream, i stdio?? Zdecyduj się, albo albo.

Odp: Błąd: Segmentation fault

: 16 lut 2009, 11:57
autor: Struchu
Hauleth pisze:bo nie masz określonych rozmiarów macierzy
Inaczej: w ogóle nie przydzielasz pamięci na macierz.

Odp: [c] Błąd:segmentation fault

: 16 lut 2009, 15:56
autor: witcher23
Ok, dzięki już wszystko działa. Dodałem tam iostream, bo mój dev c++ nie rozpoznawał funkcji srand.

Pozdrawiam

Odp: [c][solved] Błąd:segmentation fault, sumowanie macierzy

: 16 lut 2009, 16:43
autor: Hauleth
no nic dziwnego, że nie rozpoznawał skoro nie zainkludowałeś <cstdlib> :shock:

Odp: [c][solved] Błąd:segmentation fault, sumowanie macierzy

: 17 lut 2009, 01:57
autor: witcher23
Raczej nic nie muszę dodawać, wystarczy, że zmienię rozszerzenie z .cpp na .c i będzie ok. Mam teraz inny problem, bo pojawia mi się

[Linker error] undefined reference to `WinMain@16'
ld returned 1 exit status
#include<stdio.h>
#include "funkcja_suma.h"
int main(void)


{
int w, k;
int wierszA, wierszB, kolumnaA, kolumnaB;
int **A, **B;

puts("Podaj wymiar macierzy A(np 3x3): ");
scanf("%dx%d", &wierszA, &kolumnaA);

puts("Podaj wymiar macierzy B(np 3x3) :");
scanf("%dx%d", &wierszB, &kolumnaB);

A = (int**) malloc(kolumnaA * sizeof (int*));
for(w=0; w<kolumnaA; w++) *(A+w) = (int*)malloc( wierszA * sizeof(int));
B = (int**) malloc(kolumnaB * sizeof (int*));
for(w=0; w<kolumnaB; w++) *(B+w) = (int*)malloc( wierszB * sizeof(int));

srand (time (NULL));



for(k=0; k<wierszA; k++) {
for(w=0; w<kolumnaA; w++){ *(*(A+w)+k) = rand()%10;
}
}

for(k=0; k<wierszB; k++){
for(w=0; w<kolumnaB; w++){ *(*(B+w)+k) = rand()%10;
}


}
puts("Macierz A:\n");
for (k=0; k<wierszA; k++) {
for (w=0; w<kolumnaA; w++) printf("%i ", *(*(A+w)+k));
printf("\n");

}
puts("\nMacierz B:\n");
for (k=0; k<wierszB; k++) {
for (w=0; w<kolumnaB; w++) printf("%i ", *(*(B+w)+k));
printf("\n");
}

suma(A, B, wierszA, wierszB, kolumnaA, kolumnaB);


for(w=0; w<kolumnaA; w++) free(A+w);
free(A);
for(w=0; w<kolumnaB; w++) free(B+w);
free(B);

return 0;

}//koniec funkcji main
}

Odp: [c][solved] Błąd:segmentation fault, sumowanie macierzy

: 17 lut 2009, 03:35
autor: Hauleth
Weź jakiś porządny edytor i po sprawdzaj czy masz dobrze pozamykane klamry bo coś mi się to nie widzi.

Odp: [c][solved] Błąd:segmentation fault, sumowanie macierzy

: 17 lut 2009, 11:33
autor: mikolajs
Klamry są ok, bo to błąd linkera.
Dziwny błąd. Spróbuj usunąć void jako argument funkcji main. Rozumiem, że kompilujesz w gcc a nie g++ ;)