十分にコンパイルできるコードがありますが、それを実行しようとすると、セグメンテーション違反が発生し、何が問題なのかわかりません。
プログラムのポイントは、さまざまなサイズとフラグメント数の fragmentet ASCII アート ファイルのテキストをつなぎ合わせることです。フラグメントの名前は part_xx-yy で、xx は 00 から 11、yy は 00 から 05 です。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
int width;
int height;
int xPieces;
int yPieces;
int xTens=0;
int xOnes=0;
int yTens=0;
int yOnes=0;
printf("Fragment width: ");
scanf("%d", &width);
printf("Fragment height: ");
scanf("%d", &height);
printf("Number of fragments on x axis: ");
scanf("%d", &xPieces);
printf("Number of fragments on y axis: ");
scanf("%d", &yPieces);
printf("wtf0");
char *line=malloc(sizeof(width) * sizeof(char));
printf("wtf1");
char array[xPieces][yPieces][height][width];
printf("wtf2");
char fileName[50];
printf("wtf3");
for(int x = 0; x<xPieces;)
{
printf("%d", x);
for(int y = 0; y<yPieces;)
{
printf("%d", y);
if(xOnes>=10)
{
xOnes=0;
xTens++;
}
if(yOnes>=10)
{
yOnes=0;
yTens++;
}
snprintf(fileName, sizeof fileName, "part_%i%i-%i%i", xTens, xOnes, yTens, yOnes);
FILE *file=fopen(fileName, "r");
char buffer[(width) * (height)];
fread(buffer, 1, (width) * (height), file);
for(int i = 0; i<height; i++)
{
printf("%d", i);
for(int j = 0; j<width; j++)
{
printf("%d", j);
array[x][y][i][j] = buffer[j + (i * (width))];
}
}
fclose(file);
y++;
yOnes++;
}
x++;
xOnes++;
}
FILE *newFile=fopen("newFile", "w");
for(int y = 0; y<yPieces; y++)
{
for(int i = 0; i<height; i++)
{
for(int x = 0; x<xPieces; x++)
{
for(int j = 0; j<width; j++)
{
fwrite(&array[x][y][i][j], 1, 1, newFile);
}
}
}
}
fclose(newFile);
free(line);
}
デバッガーの使用方法を理解したところ、fread() に何か問題があることがわかりました。これは、fileName 配列が原因だと思われますが、いくつか変更したところ、デバッガーから得られるのは次のとおりです。
Program received signal SIGSEGV, Segmentation fault.
0x0018d68c in fread () from /lib/tls/i686/cmov/libc.so.6
おそらく fread() が小さすぎるバッファーに読み込もうとしていると思ったので、バッファーを 10000 に増やしました (これは劇的にやり過ぎである必要があります) が、残念ながら役に立ちませんでした。この問題に数時間苦労しましたが、ここからさらに先に進む方法がわかりません.
この時点で、他の誰かに私のコードを見てもらう必要があると思うので、どんな助けも大歓迎です。
.
.
更新:コードをいくつか変更して更新しましたが、代わりにここでセグメンテーション違反が発生します:
Program received signal SIGSEGV, Segmentation fault.
0x08049058 in main () at innlev3.c:50
50 *array[x][y][i][j] = buffer[j + (i * (*width))];
私はこの部分はかなり良いと思いました.ここで私は間違ったことをしましたか?
更新 2:コードが再度更新されました。非常に奇妙だと思うものを見つけました... scanf の作業の後、これらの printf はどちらもありません...そして、古き良き fread() セグメンテーション違反に戻りました。私はこれについて新しい質問をしなかったのは良いことだと思います... :P
Program received signal SIGSEGV, Segmentation fault.
0x0018d68c in fread () from /lib/tls/i686/cmov/libc.so.6
(gdb) backtrace
#0 0x0018d68c in fread () from /lib/tls/i686/cmov/libc.so.6
#1 0x08048fc6 in main ()