Mam taki problem. Oto mój plik wejściowy
S skalar1 3
S skalar2 5
V wektor1 3
2 4 7
V wektor2 3
3 6 1
M macierz_A 3 3
1 2 3
4 5 6
7 8 9
M macierz_B 3 3
9 8 7
6 5 4
3 2 1
Chciałbym z niego odczytać wszystkie elementy. Składają się one z macierzy, wektora, skalara. A każdy z nich słowa-klucza, nazwy, wymiaru (wektor i macierz) oraz wartości. Problem jest taki. Próbuję czytać te wszystkie pliki, tylko wyskakuje mi błąd segmentacji,
./primal.x dane.txt wyniki.txt
Naruszenie ochrony pamięci (zrzut pamięci)
Oto mój kod
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main (int argc, char *argv[])
{
FILE *wz, *wc;
int dimension, dimensionX, dimensionY;
if (argc != 3) {
printf("Wrong arguments number\n");
printf("I should run this way:\n");
printf("%s source\n",argv[0]);
exit(1);
}
if( (wz= fopen(argv[1],"r")) == NULL) {
printf("Open error %s\n", argv[1]);
exit(1);
}
if( (wc= fopen(argv[2], "w")) == NULL) {
printf("Open error %s\n", argv[2]);
exit(2);
}
struct Vector
{
char keyWord;
char elementName[20];
int dimension;
double V[dimension];
};
typedef struct Vector wek;
struct Scalar
{
char keyWord;
char elementName[20];
double wartosc;
};
typedef struct Scalar ska;
struct Array
{
char keyWord;
char elementName[20];
int dimensionX;
int dimensionY;
double M[dimensionX][dimensionY];
};
typedef struct Array mac;
struct Vector w1, w2;
struct Scalar s1, s2;
struct Array m1, m2;
wek readVector(FILE *wz)
{
wek w;
fscanf(wz, "%s", &w.keyWord);
fscanf(wz, "%20s", &w.elementName[0]);
for (int j = 0; j < dimension; ++j)
fscanf(wz, "%10lf", &w.V[j]);
return w;
}
ska readScalar(FILE *wz)
{
ska s;
fscanf(wz, "%s", &s.keyWord);
fscanf(wz, "%20s", &s.elementName[0]);
fscanf(wz, "%10lf", &s.wartosc);
return s;
}
mac readArray(FILE *wz)
{
mac m;
fscanf(wz, "%s", &m.keyWord);
fscanf(wz, "%20s", &m.elementName[0]);
for (int i = 0; i < m.dimensionX; ++i)
for (int j = 0; j < m.dimensionY; ++j)
fscanf(wz, "%10lf", &m.M[i][j]);
return m;
}
s1 = readScalar(wz);
s2 = readScalar(wz);
w1 = readVector(wz);
w2 = readVector(wz);
m1 = readArray(wz);
m2 = readArray(wz);
printf("Symbol %c, nazwa %s, wartosc %lf", s1.keyWord, s1.elementName, s1.wartosc);
fclose(wz);
fclose(wc);
return 0;
}
Chyba przeczuwam w czym jest problem, ale pewny nie jestem.
Problem jest z pamięcią. Chodzi dokładnie o nazwy, czyli wszędzie, gdzie się znajduje
char elementName[20];
do każdej struktury wsadziłem tego typu zmienną.
Teraz próbuję wsadzić podczas wczytywania do tej tablicy znaków literki. Tablica ma sporą pojemność, więc wszystko powinno się zmieścić. Zaczynam od pierwszej pozycji w tablicy przy wczytywaniu no nie?
fscanf(wz, "%20s", &m.elementName[0]);
Zastanawiałem się jeszcze nad użyciem tablicy wskaźników typu
const char *s = "Monty Python";
Ale jak w takim wypadku rezerwować pamięć, trzeba używać malloc czy coś takiego? Poradźcie mi chłopaki czy to z tego wziął się błąd i jak najlepiej sobie z tym poradzić