C言語でコンパイル後にセグメントエラーが発生する原因とは?

このQ&Aのポイント
  • C言語でコンパイル後にセグメントエラーが発生する場合、原因はどこにあるのでしょうか?初心者の方でも理解しやすいように、具体的な指摘をお願いします。
  • この記事では、C言語でコンパイル後にセグメントエラーが発生する原因について解説します。初心者の方でも理解しやすいように、具体的な指摘を行います。
  • C言語のプログラムをコンパイルした後、セグメントエラーが発生してしまう場合、どのような原因が考えられるのでしょうか?初心者の方でもわかりやすいように解説します。
回答を見る
  • ベストアンサー

C言語なうなんですが、コンパイルまでは行ったんですが、セグメントエラー

C言語なうなんですが、コンパイルまでは行ったんですが、セグメントエラーを起こしてしまいます。初心者なのでどこがおかしいのかもわかりませんので、ご指摘いただけるとありがたいです。 以下がそれでゲソ。始点と終点を指定して線を描いてもらうプログラミングを目指す。 #include <stdio.h> #include "../Glib/Glib.h" int main(void) { int x1,y1,x2,y2; printf("直線の始点の座標(x1,y1)のx1,y1を、間にカンマ','を入れて入力してください。"); scanf("%d" ,"%d" ,&x1 ,&y1); printf("直線の終点の座標(x2,y2)のx1,y1を、間にカンマ','を入れて入力してください。"); scanf("%d" ,"%d" ,&x2 ,&y2); G_init(); G_open(800,600,"Draw Line"); G_show(); G_black(); G_fillrect(0, 0, 800, 600); G_flush(); printf("Return Key を押してください。\n"); getchar(); G_white(); G_fillrect(0, 0, 800, 600); G_rgb(0,0,8); void G_line(int x1, int y1, int x2, int y2); G_flush(); printf("Return key を何回か押すと終了します。\n"); getchar(); getchar(); G_close(); return (0); }

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

本題は終わっているようなものなのでもうどうでもいいんですが, 指摘されている部分を直すだけでは線は引かれないと思いますよ. 関数呼び出しになっていないところが 1箇所あります. あと getchar もなんかあやしい. 「return key を何回か押すと」って書いてあるんだけど, 実際には「1回押すだけ」で終わっちゃうこともある. 以下は余談: 確かに「コンパイルまでは行ったんですが、セグメントエラーを起こしてしまいます」という表現がおかしいのは事実. 「セグメントエラー」がどの時点で出ているのかがわからん. とはいえ「コンパイルの意味がおかしい」ということはないですな. むしろ「C言語を作る」の方がはるかにおかしい. あと, 「特定セグメントに対応するコンバター」とか「セグメントの位置は、端末それぞれによっても異なる」というのはどのような処理系を想定した表現なんだろう.

gameta104
質問者

お礼

多分出来ました。ありがとうございました 。

gameta104
質問者

補足

ありがとうございました。 scanfについては解決しました。 関数呼び出しというのはどの話でしょうか。

その他の回答 (4)

回答No.4

scanf( 書式指定文字列, 格納可変個引数 ); に対して scanf("%d" ,"%d" ,&x1 ,&y1); となってます。これでは書式文字列が"%d"で、格納可変引数が"%d" ,&x1 ,&y1です。 どう書くべきかはscanfの使いかたを勉強してください。

gameta104
質問者

お礼

ありがとうございました。 scanfについては解決しました。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

>アナタの言う、「コンパイル」の意味は、かなりおかしいですよ。 そうかなぁ?そんな風には思わないですが…。 質問者さんへ: scanf()の第1引数と第2引数以降の書き方を再度研究してみてください。

gameta104
質問者

お礼

ありがとうございました。 scanfについては解決しました。

回答No.2

scanf関数の使い方が間違っています。

gameta104
質問者

補足

どう違っているんでしょうか? 詳しく教えていただけるとうれしいです。

回答No.1

「C言語」と「コンパイル」または「コンパイラ」は全くの別モノです。 アナタが作った「C言語」をコンパイルした先、コンパイルしたい先によります。 通常、インタープリタで記載・実行できる・したものを「コンパイル」する場合、特定・個別の機種やフォーマットに移入するために、「インタープリタ=コンパイラ」のアプリを使用しますよね? アナタの言う、「コンパイル」の意味は、かなりおかしいですよ。 どんなフォーマット、どんな端末にコンパイルするんですかぁぁぁぁぁぁぁぁぁぁぁぁぁ(笑)??? コンパイルする前に、特定セグメントに対応するコンバターを使用するべきでは??? セグメントの位置は、端末それぞれによっても異なるのに、アナタの場合、その基礎もできていないようです。 基礎から学ぶべきです。

gameta104
質問者

お礼

そうなんですか…知りませんでした… 一応基礎から学ぶためにこの課題に取り組んでるわけなんですが、基礎の基礎というのがあるわけですね。 勉強不足なのは承知ですが、もっと勉強しようと思います…

関連するQ&A

  • C言語

    文を繰り返すときに、『続けますか(Y=続行。N=終了)』と表示して、Yが入力されたら文を繰り返すようにしたいのですが、わからないので教えてください。 #include<stdio.h> int main(void) { int m,s,r,num; char moji; num=1; do{ printf("距離を入力してください。\n"); scanf("%d",&m); printf("平均速度を入力してください。\n"); scanf("%d",&s); r=m/s; printf("所要時間は%dです。\n",r); printf("続けますか?(Y=続行。N=終了)\n");/*このあたりがどうすればいいのかわかりません*/ moji=getchar(); }while(num) printf("終了します。\n"); return 0; }

  • C言語の質問です。

    #include"stdio.h" int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = a+b; printf("add=%d\n", add); return 0; } と、------------------------------------------------------------------------------ #include"stdio.h" int tasizan(int x, int y); int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = tasizan(a, b); printf("add=%d\n", add); return 0; } int tasizan(int x, int y){ int aa; aa = x + y; return aa; } の違いを教えてください。

  • C言語。どうしてコンパイルできません^^;

    最近プログラミングの勉強をはじめました。 C言語を勉強しています。 /*入力した値の、平均値・最大値・最小値・を出す。*/ #include <stdio.h> int main(void) { int x[5],i,j,w,x,y,z,sum; printf("5つの実数の平均、最大値、最小値を求めます\n"); sum = 0; for(i=0; i<5; i++){ printf("値%d:",i+1); scanf("%d",&x[i]); sum += x[i]; } for(y=0; y<5; y++){ for(j=0; j<4; j++){ w=j+1; if(x[j] < x[w]){ z = x[i]; x[i] = x[w]; x[w] = z; } } } printf("平均値:%f\n最大値:%d\n最小値:%d\n", (double)sum/5, x[0], x[4]); return 0; } Microsoft Visual C++ 2008 Express Edition でコンパイルをしようとしたのですが、 「error C2040: 'x' : 'int' は 'int [5]' と間接操作のレベルが異なります。」 と出てできませんでした^^; 何度も見直したのですが、どうしても間違っている場所がわかりません^^; どこがいけないのでしょうか^^;

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • C言語、ポインタについて。

    C言語初心者です。"やさしいC"などの入門書を呼んでいて「ポインタ」につまづきました。 別書を買ったり、サイトを見たりしたのですが、理解できませんでした。 "やさしいC"からの引用なのですが、 正: #include <stdio.h> int add(int *x1,int *x2,int a); int main (void){ int n1,n2,a,ans; printf("2科目分の点数を入力してください。\n"); scanf("%d",&n1); scanf("%d",&n2); printf("加算する点数を入力して下さい。\n"); scanf("%d",&a); ans = add(&n1,&n2,a); printf("%d点加算しましたので\n",a); printf("科目1は%d点となりました。\n",n1); printf("科目2は%d点となりました。\n",n2); } int add(int *x1, int *x2,int a){ *x1+=a; *x2+=a; } 誤: #include <stdio.h> int add(int x1,int x2,int a); int main (void){ int n1,n2,a,ans; printf("2科目分の点数を入力してください。\n"); scanf("%d",&n1); scanf("%d",&n2); printf("加算する点数を入力して下さい。\n"); scanf("%d",&a); ans = add(n1,n2,a); printf("%d点加算しましたので\n",a); printf("科目1は%d点となりました。\n",n1); printf("科目2は%d点となりました。\n",n2); } int add(int x1, int x2,int a){ x1+=a; x2+=a; } この2つの違いはなんでしょうか。 アドレスか、そうでないか、という違いはわかりますが、なぜ"誤"のコードだと正しく処理されないのかがわかりません。 教えてください、お願いします。 (「やさしいC」の回答より引用)

  • C言語(条件処理について)

    二つの球の接触を判断するプログラムを作るという宿題が出されてたのですが、if文による条件処理をどのように書けば良いか分かりません。お助けください。 接触パターンはいくつかあると思いますが、その接触するときの条件について以下のソースコードより後、どんなソースコードを追加すれば良いか教えてもらえませんか? 接触する条件を記述するだけでも良いので回答のほうを至急、お願いします。 何か間違っていれば修正のほうもお願いします。 ソースコード #include<stdio.h> int main(void) { float x1,y1,z1,x2,y2,z2; float r1; float r2; printf("x1="); scanf("%l",&x1); printf("y1="); scanf("%l",&y1); printf("z1="); scanf("%l",&z1); printf("r1="); scanf("%l",&r1); printf("x2="); scanf("%l",&x2); printf("y2="); scanf("%l",&y2); printf("z2="); scanf("%l",&z2); printf("r2="); scanf("%l",&r2); /* この部分の追加をお願いします。 if(){ printf("接触した"); } else{ printf("接触していない"); } */ return 0; }

  • C言語のプログラムについて質問

    明解C言語という書籍に 大きい方を表示するプログラム #include <stdio.h> int maxof(int x, int y) {  if (x > y)   return (x);  else   return (y); } int main(void) {  int na, nb;  puts("二つの整数を入力してください。");  printf("整数1:"); scanf("%d", &na);  printf("整数1:"); scanf("%d", &na);  printf("大きいほうの値は%dです。\n", maxof(na, nb));  return (0); } の関数maxofを利用し、 int max4(int w, int x, int y, int z) {  return (maxof(maxof(w, x), maxof(y, z))); } を挿入して変えれば四つの整数から最大値を求められるとのことですが、 コンパイルがうまくいきません。 関数maxofのwとx,yとzをそれぞれ比較し最大値を求めてさらにmaxof(w, x)とmaxof(y, z)を比較して最大値を求めるということですよね?ですので、 maxof(w, x) {  if (w > x)   return (w);  else   return (x); } maxof(y, z) {  if(y > z)   return (y);  else   return (z); を挿入しようとしたらmaxofはすでにありますというようなことが表示されてだめでした。 また、 int maxof(maxof(int w, int x), maxof(int y, int z)) { if (w > x)   return (w); if (w < x)   return (x); if (y > z)   return (y); if (y < z)   return (z); if (maxof(w, x) > maxof(y, z))   return (maxof(w, x)); if (maxof(w, x) < maxof(y, z))   return (maxof(y, z)); } としてみましたがやはりだめでした。 前のページの説明を読み返したりネットで調べてもわかりませんでした。 何がわからないのかがわからないのでもうお手上げです。 長くなってすいません プログラム例と説明をお願いします。

  • C言語(条件処理)

    二つの球の接触を判断するプログラムを作るという宿題が出されてたのですが、if文による条件処理をどのように書けば良いか分かりません。お助けください。 接触パターンはいくつかあると思いますが、その接触するときの条件について以下のソースコードより後、どんなソースコードを追加すれば良いか教えてもらえませんか? 接触する条件を記述するだけでも良いので回答のほうを至急、お願いします。 何か間違っていれば修正のほうもお願いします。 ソースコード #include<stdio.h> int main(void) { float x1,y1,z1; //x1,y1,z1は球1の中心の位置座標 float x2,y2,z2; //x2,y2,z2は球2の中心の位置座標 //例えば(3,0,0)であれば球の中心がx軸に3の位置にいることを指す。 float r1; //球1の半径 float r2; //球2の半径 printf("x1="); scanf("%f",&x1); printf("y1="); scanf("%f",&y1); printf("z1="); scanf("%f",&z1); printf("r1="); scanf("%f",&r1); printf("x2="); scanf("%f",&x2); printf("y2="); scanf("%f",&y2); printf("z2="); scanf("%f",&z2); printf("r2="); scanf("%f",&r2); この部分の追加をお願いします。 if(){ printf("接触した"); } else{ printf("接触していない"); } return 0; } もしくは r1とr2を入力ではなく、初期化したほうが良いのでしょうか?・・・ そうであれば、修正のほうもお願いします。

  • ヒルベルト曲線のプログラム(C言語)

    私は画像の勉強をしています。それで従来の水平スキャンではなく2次元相関をたもったまま1次元配列に変換できるヒルベルトスキャンとBWT変換とエントロピー符号化を用いて圧縮する方法を勉強しています。しかしヒルベルトのほうができなくて困っています。 プログラムの実行結果でヒルベルト曲線通る座標を示すプログラムを教えてください。だいたいは書けましたがうまくいきません。プログラムは #include<stdio.h> int x,y; main() { int n; void RUL(int n),DLU(int n),LDR(int n),URD(int,n); scanf("%d",&n); printf("#位相%dのヒルベルト曲線\n",n); x=0; y=0;printf("%d\n",x,y); RUL(n);printf("\n"); } void RUL(int n) { if(n<=0) {return;} URD(n-1);x=x+1;printf("%d %d\n",x,y); RUL(n-1);y=y+1;printf("%d %d\n",x,y); RUL(n-1);x=x-1;printf("%d %d\n",x,y); DLU(n-1); } void DLU(int n) { if(n<=0) {return;} LDR(n-1);y=y-1;printf("%d %d\n",x,y); DLU(n-1);x=x-1;printf("%d %d\n",x,y); DLU(n-1);y=y+1;printf("%d %d\n",x,y); RUL(n-1); } void LDR(int n) { if(n<=0) {return;} DLU(n-1);x=x-1;printf("%d %d\n",x,y); LDR(n-1);y=y-1;printf("%d %d\n",x,y); LDR(n-1);x=x+1;printf("%d %d\n",x,y); URD(n-1); } void URD(int n) { if(n<=0) {return;} RUL(n-1);y=y+1;printf("%d %d\n",x,y); URD(n-1);x=x+1;printf("%d %d\n",x,y); URD(n-1);y=y-1;printf("%d %d\n",x,y); LDR(n-1); } です。それをBWT変換とエントロピー符号にかけ圧縮させその圧縮率を求めその後画像はちゃんと戻るかを調べるために復元のプログラムを書かないいけませんがそのプログラムがわかりません。教えてください。

  • C言語のプログラムでうまく動きません。

    xとyを入力してその商を求めよという問題なのですが、大きい数字を小さい数字で割るようになっています。また、当然分母が0の時には不定となるので、次のようなプログラムを作りましたが、うまく動きません。どこが悪いか考えてもわかりませんでした。教えていただけませんでしょうか。 #include<stdio.h> main() { int x; int y; double syou; printf("xを入力せよ"); scanf("%d",&x); printf("yを入力せよ"); scanf("%d",&y); syou=x/y; if("syou>=1") { if("y==0") { printf("不定です"); } printf("答えは%fです。",&syou); } else { if("x==0") { printf("不定です"); } syou=y/x; printf("答えは%fです。",&syou); } } これでx、yを入力しても不定と出てきて、xの方が大きいときには見当はずれの大きな数字が出てきます。逆にyの方が大きいと同じく不定と出てきて答えは0.000と表示します。

専門家に質問してみよう