今C言語の研修中で、バブルソートのプログラムをくんでいます。
それで、以下のように配列で入れ替えではなく、ポインタで入れ替えをしたいのですが、
 dt+i = dt+i+1;
 dt+i+1 = dt2;
で、
 invalid lvalue in assignment
というエラーが出てしまいます。
書き方がまちがっているんでしょうか?
参考書やHPも探してみたのですが、探し方が悪いのかどうにもわかりません。
研修中なので、調べるのも勉強だとは思うのですが、お手上げで・・・・・・
情けないですが、教えていただけると嬉しいです。
/** ソート処理 **/
static int SORT_PROC(void)
{
  int i,m;
  syouhin_typ *dt2;

  /** バブルソートでソート処理 **/
  for(m=0; m<i_cnt-1; m++){
    for(i=0; i<i_cnt-1;i++){
      if(strncmp((dt+i)->code,(dt+i+1)->code,sizeof(dt->code)) >= 0){
         dt2 = dt+i;
         dt+i = dt+i+1;
         dt+i+1 = dt2;
      }
    }
  }
}

ちなみにdtはグローバル変数で、
typedef struct{
  char code[5]; /** 商品コード **/
  char uriage[5]; /** 売上数 **/
}syouhin_typ;

/** グローバル変数 **/
syouhin_typ *dt; /** 商品 **/

としてあります。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

a-kuma> ANSI の規格が無かった頃ならいざ知らず、今どきの普通のコンパイラは構造体の


a-kuma> 代入を許してくれますぜ。

どうも古い頭で済みません。
が、

sora8181> *dt2 = *(dt+i);
sora8181> だとコンパイルの時にコアダンプしてしまうので、
sora8181> dt2 = (dt+i);
sora8181> でコンパイルが通りました。

実行時ならいざしらず、コンパイル時にエラーとなるのは、sora8181さんのコンパイラが
この記述を許していない証拠です。*を落としたのでは意味が変わってしまいますから、
これでコンパイルが通っても困ります。
    • good
    • 0
この回答へのお礼

確かにこれでコンパイルが通っても困ったようです。

結局
syouhin_typ dt2;

...

dt2 = *(dt+i);
*(dt+i) = *(dt+i+1);
*(dt+i+1) = dt2;

にしました。

実行してみたところ、データの最期まで比較をしてくれてなくて
まだ悩み中なんですが、この問題に関してはこれでOKだと思います。
ありがとうございます。

お礼日時:2001/12/13 16:29

>実体については、別ファイルでデータの制限をしない、と言われましてsyouhin_typ *dt[100];


>とできないのです。
えっと、よくわからないのですが、ではグローバル変数 dtはどう初期化されているのでしょうか?まずソコが知りたかったのですが...。
一応、*dt[100]というのも考え方の一つとして、です。
予めファイルサイズ等によりデータ数(n)が解るのでしたら、グローバル変数の宣言を
syouhin_typ **dt;
とし、
dt = (syouhin_typ*)malloc(sizeof(syouhin_typ*) * n);
で可変の領域にすれば良いでしょう。
また、データ数が解らないのなら list形式のデータタイプにすることもできます。
typedef struct {
 syouhin_typ *next;
 char      code[5];
 char      uriage[5];
} syouhin_typ;

データの格納方法は割愛。
    • good
    • 0
この回答へのお礼

初期化はこれまた説明不足で・・・・・・mallocとreallocでエリアを確保しています。
ので、そこで初期化しているはずです。

見当違いな補足で申し訳ないです。
また次の機会にも是非教えていただけたら、と思います。
ではでは。

お礼日時:2001/12/13 17:40

ranx> 実行時ならいざしらず、コンパイル時にエラーとなるのは、sora8181さんのコンパイラが


ranx> この記述を許していない証拠です。

ああ、本当だ。「コンパイルの時にコアダンプしてしまうので」とありますね。
質問が終息しそうですが、最後に使っている環境を教えてもらえるとうれしいなあ > sora8181さん
    • good
    • 0
この回答へのお礼

まだまだソートファイルの完成は遠そうですが、がんばってみます。
環境なんですが、UNIX OS:MS-Windows 95 MS-Windows NT 3.51, 4.0
です。
ちなみに今更すっとぼけたことをお伺いしますが、
環境は?って聞かれたらこんな感じの答えであってますか?
コンパイラがどういうものなのか調べようとしたんですがどうすればいいのやら。

とにかくありがとうございました。
またお伺いすることがあるかと思いますので、そのときはよろしくお願いします。

お礼日時:2001/12/13 17:16

ranx> 結局入れ替えるのは「中身」というのはa-kumaさんのおっしゃる通りなのですが、


ranx> 構造体なので、単純な代入はできません。

何をおっしゃる。

ANSI の規格が無かった頃ならいざ知らず、今どきの普通のコンパイラは構造体の
代入を許してくれますぜ。

で、私の回答に対するお礼については ranx さんの

ranx> それと、dt2の実体領域も忘れないように。

が回答になります。


syouhin_typ dt2;

...

dt2 = *(dt+i);
*(dt+i) = *(dt+i+1);
*(dt+i+1) = dt2;
    • good
    • 0

結局入れ替えるのは「中身」というのはa-kumaさんのおっしゃる通りなのですが、


構造体なので、単純な代入はできません。

> dt2 = dt+i;
> dt+i = dt+i+1;
> dt+i+1 = dt2;

の部分を

memcpy(dt2, dt+i, sizeof(syouhin_typ));
memcpy(dt+i, dt+i+1, sizeof(syouhin_typ));
memcpy(dt+i+1, dt2, sizeof(syouhin_typ));

としましょう。

yatokesaさんのおっしゃる実体領域の確保ですが、
私は
syouhin_typ dt[100];
のような感じでいいと思います。

それと、dt2の実体領域も忘れないように。

あと、内側のループですが、これでも間違いとは言えませんが、
for(i=0;i<i_cnt-1-m;i++)
で良いはずです。
不必要な比較をしています。
    • good
    • 0

>/** グローバル変数 **/


>syouhin_typ *dt; /** 商品 **/
この実体はどのように確保しているのですか?
私がコーディングするならば、
syouhin_typ *dt[100];
:
for(int i = 0; i<100; i++) {
 dt[i] = malloc(sizeof(syouhin_typ));
 sprintf(dt[i]->code, "%d", i); //データ格納
}
というような感じにします。これならばご質問のコーディングが生かされると思います。
まずはどのようなデータ構造になっているのか教えてください。

この回答への補足

説明不足で申し訳ありません。

実体については、別ファイルでデータの制限をしない、と言われましてsyouhin_typ *dt[100];
とできないのです。

補足日時:2001/12/13 16:30
    • good
    • 0

ポインタを使っていますが、結局入れ替えるのは「中身」ですよね。



> dt2 = dt+i;
> dt+i = dt+i+1;
> dt+i+1 = dt2;

*dt2 = *(dt+i);
*(dt+i) = *(dt+i+1);
*(dt+i+1) = *dt2;

です。
    • good
    • 0
この回答へのお礼

早速のお返事ありがとうございます!
*dt2 = *(dt+i);
だとコンパイルの時にコアダンプしてしまうので、
dt2 = (dt+i);
でコンパイルが通りました。

これはポインタだから*をつけろよってことでいいんですかね?
あと、ついでに時間があったらでいいんですが、更に問題だでてきまして・・・・・・
時間があったら教えてください。

先ほどのプログラムだと、
*(dt+i) = *(dt+i+1);
の時点でdt2の値も*(dt+i+1)の値に変わってしまうんです。
これはポインタだからだと思うんですが、
どうしたものかとおもいまして・・・・・・厚かましくてすみません。

お礼日時:2001/12/13 15:47

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q構造体配列の安定なソート

出席番号と得点の配列を持つ構造体配列で、
出席番号順に並んだ状態でqsortを使って得点をソートする場合、
同じ得点の人でも、出席番号順はばらばらになってしまいますよね。

調べてみて、バブルソートなど安定なソートを使えばいいということが分かったのですが、
qsortは標準ライブラリにあって、
比較関数も見よう見まねで作ってなんとかなったのですが、
他の方法となると具体的にどうすればいいのか、
よくわからない状況です。

http://homepage1.nifty.com/daccho/program/algo/sort3.htm

こちらのサイトのソースファイルを見て、
普通のint配列のバブルソートは出来たのですが、
構造体配列を、構造体の中の一つの要素をキーにバブルソートできるようにするには、
ここからどのように変更すればいいのでしょうか?

並び替える内容はint型だけなので、文字列をソートできるようにする必要はなく、
ソート対象も少ないので(上限100程度)、速度的な問題は考慮しなくて大丈夫だと思います。

Cは勉強中で、基本文法がわかるぐらいという状況で、
もしかしたら変なことを言っているのかもしれませんが、
よろしくお願いします。

出席番号と得点の配列を持つ構造体配列で、
出席番号順に並んだ状態でqsortを使って得点をソートする場合、
同じ得点の人でも、出席番号順はばらばらになってしまいますよね。

調べてみて、バブルソートなど安定なソートを使えばいいということが分かったのですが、
qsortは標準ライブラリにあって、
比較関数も見よう見まねで作ってなんとかなったのですが、
他の方法となると具体的にどうすればいいのか、
よくわからない状況です。

http://homepage1.nifty.com/daccho/program/algo/sort3.htm

...続きを読む

Aベストアンサー

>構造体のメンバを引数に渡すにはどうすればいいかとか、
>bubble_sort(&table[0].score, 10);
bubble_sort(&table[0], 10)
とすればいいと思います。
>メンバの配列を比較してメンバの順番だけ入れ替えたら、
>名前と得点の対応が壊れるから、
構造体自体は、出席番号と得点を保持しているのだから、
出席番号から名前が引き出せるのであれば、対応をとる必要はないと思うのですが、構造体の配列の並びがどっか別にある名前テーブル(配列?)と対応しているということであれば、名前テーブルも並び替える必要があるのかなぁとか思いますが、そんな必要はないような気がします。
なんか、どういうデータ構造になっているかよくわからないので、勘違いしてたらすみませんです。
できたら、バブルソート版のプログラムを補足していただけますか?

Q複数桁10進数の*桁目だけを抽出したい

タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

Aベストアンサー

★10進数ですので AND は使えませんね。
・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。

QC言語の構造体にてバブルソートが上手くいきません‥

C言語の構造体にてバブルソートが上手くいきません‥

初めて質問致します。

以下は、構造体で、身長順にバブルソートを行うソース文ですが、
結果表示が、最下部に示したように、
5つのレコードのうち1つが消えてしまい、
残った4つのレコードのうちの1つが重複されて表示されてしまいます。
これが、なかなか解決できません‥。

既に結構調べており、また、早く解決できないといけないこともあり、
すみませんが、回答の形式でお願いできますと大変幸いです。
何卒よろしくお願い致します。


#include<stdio.h>
#include<string.h>

typedef struct kojin {
char name[21];
int length;
int weight;
}KOJIN;

int main(void)
{
int i, c, j;
char buf[4];
KOJIN data[10];
KOJIN *d;

printf(

C言語の構造体にてバブルソートが上手くいきません‥

初めて質問致します。

以下は、構造体で、身長順にバブルソートを行うソース文ですが、
結果表示が、最下部に示したように、
5つのレコードのうち1つが消えてしまい、
残った4つのレコードのうちの1つが重複されて表示されてしまいます。
これが、なかなか解決できません‥。

既に結構調べており、また、早く解決できないといけないこともあり、
すみませんが、回答の形式でお願いできますと大変幸いです。
何卒よろしくお願い致します。


#i...続きを読む

Aベストアンサー

>for(i=0;i<10;i++) {
>d = &data[i];

最終的には、 dには &data[9] 、つまり、data[9]へのポインタが入っているわけです。
そして、そのまま

>*d= data[i];
>data[i]= data[j];
>data[j]= *d;
を実行したら
*dはdata[9]になりますから

data[9]= data[i];
data[i]= data[j];
data[j]= data[9];

と同じ事、となります。
一応、data[i]とdata[j]との入れ替えにはなりますが、同時にdata[i]がdata[9]へコピーされてしまい、もとあったdata[9]の内容が失われます。
最終的に、最後の入れ替えが発生したときのdata[i]と同じ値がdata[9]に入っているとこになります。

対策は、この KOJIN *d を使わないことです
KOJIN temp ;
としておいて

temp= data[i];
data[i]= data[j];
data[j]= temp;

とします。

ところで、これ、バブルソートじゃないですよ。
単純ソートというアルゴリズムになってます。
アルゴリズムの参考書等をもう一度よく確認してください。

>for(i=0;i<10;i++) {
>d = &data[i];

最終的には、 dには &data[9] 、つまり、data[9]へのポインタが入っているわけです。
そして、そのまま

>*d= data[i];
>data[i]= data[j];
>data[j]= *d;
を実行したら
*dはdata[9]になりますから

data[9]= data[i];
data[i]= data[j];
data[j]= data[9];

と同じ事、となります。
一応、data[i]とdata[j]との入れ替えにはなりますが、同時にdata[i]がdata[9]へコピーされてしまい、もとあったdata[9]の内容が失われます。
最終的に、最後の入れ替えが発生したときのdata[...続きを読む

Qc言語のポインタへの文字列入力についてです。

当方c言語初学者なのですがscanfを使ってポインタに文字列を入力したいのですがバグが発生して進みません・・・どういうことなのでしょうか?
#include <stdio.h>

int main(void)
{
char *a;

scanf("%s", a);
printf("%s", a);

return (0);
}

*aをa[128]; のように配列に変えるとうまくいくことはなんとかわかるのですが・・・助けてください(^_^;)

Aベストアンサー

ポインターというのは格納された値のアドレスのメモリーを指すための変数です。
一方、配列はデータを格納するためのメモリーを確保して、その先頭のアドレスが入っていますよ。

char *a;
scanf("%s", a);

と書くと、aを初期化せずにaの指す先にscanfで文字列を入れます。
大抵、プログラムが書き込むことを許されていないメモリーに書き込みを行おうとしたことを検出したOSからそのプログラムは強制終了されます。

char *a = "aaaaa";
scanf("%s", a);
となっているとどうなるか。
aは"aaaaa"が格納されているメモリーを指すように初期化されます。
ただ、大抵"aaaaa"は固定値を入れるために書き込みができないメモリーに格納されています。
よって、scanf("%s", a);も書き込みができないところに書こうとしたことをOSに検出され、強制終了となります。

2つ方向があると思います。
1. char a[128];のように宣言し、スタック上にメモリーを確保し、その先頭アドレスが入っているaを渡す方法。
2. mallocなどでヒープにメモリーを確保する方法。

1だと、
char a[128];
scanf("%127s", a);
のように書き、scanfで読み込んだ分をaから始まるメモリーに書くことになりますが、char a[128];で配列を確保しているので書き込みを行うことができ、強制終了はされません。

2だと、
char *a = malloc(128);
scanf("%127s", a);
printf("%s", a);
free(a);
のように書きます。
配列はスタック上に取られ、スタック上に取った値はプログラムがその関数を抜けるときに自動的に解放されますが、mallocで確保したメモリーは自動で解放されないので自分でfreeを呼んで開放する必要があります。

%127sがそろそろ気になっていると思います。
こうやって127文字までしか受け取らないようにscanfに指示しています。
C言語では文字列の最後は終了を示すNUL文字が入るので、確保したメモリーよりも1少ない値となっています。

というわけで、ちゃんとメモリーを確保してからscanfで書き込みましょう。ポインターはあくまでどこかのメモリーアドレスを指すだけで、指した先がちゃんと確保されているかどうかは知りませんから。

ポインターというのは格納された値のアドレスのメモリーを指すための変数です。
一方、配列はデータを格納するためのメモリーを確保して、その先頭のアドレスが入っていますよ。

char *a;
scanf("%s", a);

と書くと、aを初期化せずにaの指す先にscanfで文字列を入れます。
大抵、プログラムが書き込むことを許されていないメモリーに書き込みを行おうとしたことを検出したOSからそのプログラムは強制終了されます。

char *a = "aaaaa";
scanf("%s", a);
となっているとどうなるか。
aは"aaaaa"が格納されている...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Q配列・ポインタに関する問題について

この春IT系の会社に入社し、ただいまプログラミングの研修中の者です。
学生時代はプログラミングとは無縁の存在でしたので、プログラミングに関しては初心者です。

早速質問なのですが、
「(30点、47点、99点、64点…)などの50人分の生徒のテストの点数の上位・下位5名分を表示せよ。」
という問題に詰まってしまい困っています。
わからないのは以下の2点です。

(1)どうやって成績順に並べるのか?
(2)成績順に並べた後、どうやって上位・下位5名を選出するのか?

(1)に関してはソートを使うと思うのですが、配列とポインタがどう絡んでくるのかいまいちイメージがわきません。

 また、プログラミングのサンプルソースも見たのですが
 void sort(const int num, int *ary)や sort(ARRAY_SIZE, array);
 の部分がよくわかりません。
()があるということはifやforと同じような位置付けなのでしょうか。

(2)に関してはif文を使用して条件付け→選出でよいのでしょうか?

初心者丸出しの質問でお恥ずかしい限りですが、アドバイスお願いいたします。

この春IT系の会社に入社し、ただいまプログラミングの研修中の者です。
学生時代はプログラミングとは無縁の存在でしたので、プログラミングに関しては初心者です。

早速質問なのですが、
「(30点、47点、99点、64点…)などの50人分の生徒のテストの点数の上位・下位5名分を表示せよ。」
という問題に詰まってしまい困っています。
わからないのは以下の2点です。

(1)どうやって成績順に並べるのか?
(2)成績順に並べた後、どうやって上位・下位5名を選出するのか?

(1)に関してはソートを使うと...続きを読む

Aベストアンサー

★どうもソート部分も自分で実装するようですね。
・全体的には回答者 No.2 さんのアドバイスを参考にして下さい。
 私はソート部分のみをアドバイスします。
・ソートのアルゴリズムはいろいろありますが、一番簡単なソートは『バブルソート』です。
 このソート方法は、配列で隣り合う2つを比較してより大きい数を配列イメージで右側に
 残す(入れ替える)事でソートを完了します。なおソートには『昇順』、『降順』の2タイプが
 あります。
 『昇順』⇒小さい順に並べること
 『降順』⇒大きい順に並べること
・今回は成績順に並べるようですが、一般に成績順とは、大きい順に並べることになるので
 ソート処理は『降順』タイプになります。実装すべきソート関数 sort は引数の並びから
 データ件数、データ配列の2つを受け取ります。

ソートの考え方:
・説明の都合上 4 人分の成績データを用意します。
 そのデータとは、30点、47点、99点、64点です。→int array[ 4 ] = { 30, 47, 99, 64 };
 ソート処理は降順タイプなので、左側から右にかけて大きい数→小さい数の並びになります。
 ●1回目の比較スキャン
  (1)30点、47点を比較する。
   左側を大きい数にするため、30点、47点を入れ替える。
   int array[ 4 ] = { 47, 30, 99, 64 };
  (2)次は30点、99点を比較する。
   左側を大きい数にするため、30点、99点を入れ替える。
   int array[ 4 ] = { 47, 99, 30, 64 };
  (3)その次は30点、64点を比較する。
   左側を大きい数にするため、30点、64点を入れ替える。
   int array[ 4 ] = { 47, 99, 64, 30 };
  (4)配列の最後なので1回目の比較スキャンは終了
 ●2回目の比較スキャン
  (1)47点、99点を比較する。
   左側を大きい数にするため、47点、99点を入れ替える。
   int array[ 4 ] = { 99, 47, 64, 30 };
  (2)次は47点、64点を比較する。
   左側を大きい数にするため、47点、64点を入れ替える。
   int array[ 4 ] = { 99, 64, 47, 30 };
  (3)2回目はここで比較スキャンを終了します。
   理由は、30点は1回目で一番小さい数であると確定しているため47点が2番目に小さい数と
   なるからです。
 ●3回目の比較スキャン
  (1)99点、64点を比較する。
   左側を大きい数にしますが、すでに99点が大きいので入れ替えません。
   int array[ 4 ] = { 99, 64, 47, 30 };
  (2)3回目はここで比較スキャンを終了します。
   理由は、30点、47点が1回目、2回目で小さい数であると確定しているためです。
 ●これで4つの成績が大きい順のソートされました。
  大小比較した際に、配列要素を入れ替えるとき『添え字』を使って入れ替える場合があります。
  しかし、配列要素のサイズが大きい場合は、ポインタを使っての入れ替えが高速になるため、
  一般にはデータ内容を表したポインタの入れ替えを行います。配列とポインタを格納している
  配列(ポインタ配列)を最初に理解して下さい。
・http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88→『バブルソート』

最後に:
・下の参考文献に、ほぼ答えのソースが載っていますが、コピー&ペーストするだけではなく、
 仕組みもちゃんと理解してから使って下さい。バブルソート以外にもたくさんのソート方法が
 ありますので、時間に余裕があれば検索してみて下さい。
・クイックソート、マージソート、挿入ソート、シェルソートなどなどあります。
 http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88→『いろいろなソート』
・バブルソートを高速にしたアルゴリズムとして、シェーカーソート、コムソートがあります。

参考文献:
・http://homepage3.nifty.com/mmgames/c_guide/a_sort-bubble.html→『バブルソート』
・http://www.codereading.com/algo_and_ds/algo/bubble_sort.html→『バブルソート』
・http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/bubble-sort.html→『バブルソート』

参考URL:http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88

★どうもソート部分も自分で実装するようですね。
・全体的には回答者 No.2 さんのアドバイスを参考にして下さい。
 私はソート部分のみをアドバイスします。
・ソートのアルゴリズムはいろいろありますが、一番簡単なソートは『バブルソート』です。
 このソート方法は、配列で隣り合う2つを比較してより大きい数を配列イメージで右側に
 残す(入れ替える)事でソートを完了します。なおソートには『昇順』、『降順』の2タイプが
 あります。
 『昇順』⇒小さい順に並べること
 『降順』⇒大きい順に...続きを読む

QC言語のポインターに関する警告

line[100]で
「1」が格納されていたら「a」
「2」が格納されていたら「b」
「3」が格納されていたら「c」
とout[100]に代入する関数を作りたいのですが
コンパイルすると関数の部分で
warning: assignment makes integer from pointer without a cast
という警告がでます。
ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。
どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。
解決法をおしえてください。お願いします。

/*宣言*/
int=i; /*main関数内のfor文で使用*/
char line[100], out[100];
void change(int);

/*関数*/
void change(int i)
  {
   if(line[i]=='1'){
    out[10]="a\0"
   }if(line[i]=='2'){
    out[10]="b\0";
   }if(line[i]=='3'){
    out[10]="c\0"
}
}

line[100]で
「1」が格納されていたら「a」
「2」が格納されていたら「b」
「3」が格納されていたら「c」
とout[100]に代入する関数を作りたいのですが
コンパイルすると関数の部分で
warning: assignment makes integer from pointer without a cast
という警告がでます。
ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。
どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。
解決法をおしえてください。お願いします。

/*宣言*/
int...続きを読む

Aベストアンサー

>    out[10]="a\0"
>    out[10]="b\0";
>    out[10]="c\0"

"a\0"や"b\0"や"c\0"は「charへのポインタ」ですよ。

out[10]は「char」ですから「記憶域が小さい整数(つまり、charに)に、ポインタを代入すると、値が失われるぞ」と警告が出ます。

void change(int i)
  {
   if(line[i]=='1'){
    out[10]='a';
   }if(line[i]=='2'){
    out[10]='b';
   }if(line[i]=='3'){
    out[10]='c';
}
}
または
void change(int i)
  {
   if(line[i]=='1'){
    out[10]=0x61; /* aのASCIIコード */
   }if(line[i]=='2'){
    out[10]=0x62; /* bのASCIIコード */
   }if(line[i]=='3'){
    out[10]=0x63; /* cのASCIIコード */
}
}
と書きましょう。

>    out[10]="a\0"
>    out[10]="b\0";
>    out[10]="c\0"

"a\0"や"b\0"や"c\0"は「charへのポインタ」ですよ。

out[10]は「char」ですから「記憶域が小さい整数(つまり、charに)に、ポインタを代入すると、値が失われるぞ」と警告が出ます。

void change(int i)
  {
   if(line[i]=='1'){
    out[10]='a';
   }if(line[i]=='2'){
    out[10]='b';
   }if(line[i]=='3'){
    out[10]='c';
}
}
または
void change(int i)
  {
   if(l...続きを読む

Qセグメンテーション違反

C言語を使用しています。

構造体に値をいれようとしたら、コンパイルは出来るのですが、実行時に
「セグメンテーション違反です (core dumped)」
となってしまい、それ以上行えません。

構造体と代入したい変数との型は、合っています。

いろいろ本などで見ましたが、何が原因かわからず困っています。
教えてください。
宜しくお願いします。

Aベストアンサー

OSは何でしょうか。コンパイラは何を使用していますか?
通常、デバッグオプションをつけて実行すると、異常の発生したソースの箇所で止まりますので、それが手がかりになります。またNo1の方が言われてますように、ソースが公開できるのであれば、ソースを提示するのが良いかと思います。

Qファイル出力で改行を入れたい!

data.txtにファイル出力を行うのですが、gets(c)で入力した一語一語に改行を入れてdata.txtに出力したいのですがどうすればよいでしょうか。
返答のほどよろしくお願いいたします。
include<stdio.h>
#define SIZE 20
void main(void)
{
char c[SIZE], *p;
FILE *fp;

fp = fopen("data.txt","w+");
p = c;
while(gets(c) != NULL){
fputs(p,fp);
}

fclose(fp);
printf("data.txtへ出力しました\n");

}

Aベストアンサー

一語一語ってのは、1回の入力毎って事でしょうか?
とするならば、これでどうでしょうか?

#include <stdio.h>
#define SIZE 20
void main(void)
{
  char c[SIZE], *p;
  FILE *fp;
  
  fp = fopen("data.txt","w+");
  p = c;
  while(gets(c) != NULL){
    fputs(p,fp);
    fputc('\n', fp);
  }
  
  fclose(fp);
  printf("data.txtへ出力しました\n");
  
}

Q再起呼び出しの回数をカウントするプログラム

現在学校の課題で
プログラムを組んでるんですが
ちょっとよくわからないことがあるので教えてください

再起呼び出しの回数をカウントして
その回数を返したいのですが

例えば

coid honoi(int n,char a,char b,char c)  {
    int count=0;
    if (n>0)  {
        hanoi(n-1,a,c,b);
        count++;
    }
}

のようなプログラムを組むと
hanoi(n-1,a,c,b)
を呼び出すと、countが再度 0 に戻され
count=1 になってしまいます。

同様に

if()  {
    int count=0;
    hanoi();
    count++
}

としても、count=1のままでした。

再起呼び出しをするたびに、この count値を増やしていくには
どのようにプログラムを書けばよいのでしょうか?

まだCは初心者レベルなので
易しめにご説明ください。
よろしくお願いします。

現在学校の課題で
プログラムを組んでるんですが
ちょっとよくわからないことがあるので教えてください

再起呼び出しの回数をカウントして
その回数を返したいのですが

例えば

coid honoi(int n,char a,char b,char c)  {
    int count=0;
    if (n>0)  {
        hanoi(n-1,a,c,b);
        count++;
    }
}

のようなプログラムを組むと
hanoi(n-1,a,c,b)
を呼び出すと、countが再度 0 に戻され
count=1 になってしまいます。

同様に

if()  {
...続きを読む

Aベストアンサー

関数の外で変数を宣言し、どこかで初期化して、カウントアップすれば実現できます。

static int count;
  :
  :
int main(int argc, char *argv[]) {

  :
  :
  count = 0;
  hanoi(適当な引数);
  :
  :

}
void hanoi(int n,char a,char b,char c)  {
    count++;
    if (n>0)  {
        hanoi(n-1,a,c,b);
    }
}

こんな感じです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報