今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; /** 商品 **/
としてあります。
No.5ベストアンサー
- 回答日時:
a-kuma> ANSI の規格が無かった頃ならいざ知らず、今どきの普通のコンパイラは構造体の
a-kuma> 代入を許してくれますぜ。
どうも古い頭で済みません。
が、
sora8181> *dt2 = *(dt+i);
sora8181> だとコンパイルの時にコアダンプしてしまうので、
sora8181> dt2 = (dt+i);
sora8181> でコンパイルが通りました。
実行時ならいざしらず、コンパイル時にエラーとなるのは、sora8181さんのコンパイラが
この記述を許していない証拠です。*を落としたのでは意味が変わってしまいますから、
これでコンパイルが通っても困ります。
確かにこれでコンパイルが通っても困ったようです。
結局
syouhin_typ dt2;
...
dt2 = *(dt+i);
*(dt+i) = *(dt+i+1);
*(dt+i+1) = dt2;
にしました。
実行してみたところ、データの最期まで比較をしてくれてなくて
まだ悩み中なんですが、この問題に関してはこれでOKだと思います。
ありがとうございます。
No.7
- 回答日時:
>実体については、別ファイルでデータの制限をしない、と言われまして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;
データの格納方法は割愛。
初期化はこれまた説明不足で・・・・・・mallocとreallocでエリアを確保しています。
ので、そこで初期化しているはずです。
見当違いな補足で申し訳ないです。
また次の機会にも是非教えていただけたら、と思います。
ではでは。
No.6
- 回答日時:
ranx> 実行時ならいざしらず、コンパイル時にエラーとなるのは、sora8181さんのコンパイラが
ranx> この記述を許していない証拠です。
ああ、本当だ。「コンパイルの時にコアダンプしてしまうので」とありますね。
質問が終息しそうですが、最後に使っている環境を教えてもらえるとうれしいなあ > sora8181さん
まだまだソートファイルの完成は遠そうですが、がんばってみます。
環境なんですが、UNIX OS:MS-Windows 95 MS-Windows NT 3.51, 4.0
です。
ちなみに今更すっとぼけたことをお伺いしますが、
環境は?って聞かれたらこんな感じの答えであってますか?
コンパイラがどういうものなのか調べようとしたんですがどうすればいいのやら。
とにかくありがとうございました。
またお伺いすることがあるかと思いますので、そのときはよろしくお願いします。
No.4
- 回答日時:
ranx> 結局入れ替えるのは「中身」というのはa-kumaさんのおっしゃる通りなのですが、
ranx> 構造体なので、単純な代入はできません。
何をおっしゃる。
ANSI の規格が無かった頃ならいざ知らず、今どきの普通のコンパイラは構造体の
代入を許してくれますぜ。
で、私の回答に対するお礼については ranx さんの
ranx> それと、dt2の実体領域も忘れないように。
が回答になります。
syouhin_typ dt2;
...
dt2 = *(dt+i);
*(dt+i) = *(dt+i+1);
*(dt+i+1) = dt2;
No.3
- 回答日時:
結局入れ替えるのは「中身」というのは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++)
で良いはずです。
不必要な比較をしています。
No.2
- 回答日時:
>/** グローバル変数 **/
>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];
とできないのです。
No.1
- 回答日時:
ポインタを使っていますが、結局入れ替えるのは「中身」ですよね。
> dt2 = dt+i;
> dt+i = dt+i+1;
> dt+i+1 = dt2;
*dt2 = *(dt+i);
*(dt+i) = *(dt+i+1);
*(dt+i+1) = *dt2;
です。
早速のお返事ありがとうございます!
*dt2 = *(dt+i);
だとコンパイルの時にコアダンプしてしまうので、
dt2 = (dt+i);
でコンパイルが通りました。
これはポインタだから*をつけろよってことでいいんですかね?
あと、ついでに時間があったらでいいんですが、更に問題だでてきまして・・・・・・
時間があったら教えてください。
先ほどのプログラムだと、
*(dt+i) = *(dt+i+1);
の時点でdt2の値も*(dt+i+1)の値に変わってしまうんです。
これはポインタだからだと思うんですが、
どうしたものかとおもいまして・・・・・・厚かましくてすみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
C#で char型とstring型の比較で...
-
同じEXE・同じファイルで解析結...
-
math.hに含まれる関数が使えない
-
DLLは解読可能ですか
-
[COBOL] ソースの復帰
-
64ビットのlinuxで32ビットメモ...
-
実行後にコンパイルに失敗しま...
-
すべてのリビルド: 0 正常、 0 ...
-
新版 明解C++ 入門編 に...
-
サクラエディタとコンパイラ
-
「インクルードファイル 'pthre...
-
C言語で作ったらWindowsでもMac...
-
NASMとMASMの違い
-
gccを使ってのリンク時のライブ...
-
fatal error LNK1112
-
PIC同士のシリアル通信について
-
cygwinでmakeが見つからない
-
c言語です コンパイルした時に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
すべてのリビルド: 0 正常、 0 ...
-
lhafileをインストールしたい
-
C#で char型とstring型の比較で...
-
gcc コンパイル killed
-
[COBOL] ソースの復帰
-
c言語です コンパイルした時に...
-
実行後にコンパイルに失敗しま...
-
共有ライブラリの内容確認について
-
ビープ音が鳴りません・・・
-
gcc バージョン違いによるコン...
-
64ビットのlinuxで32ビットメモ...
-
NASMとMASMの違い
-
C言語で作ったらWindowsでもMac...
-
math.hに含まれる関数が使えない
-
MVSマシンで0C7でABENDしたので...
-
ccとgcc
-
「インクルードファイル 'pthre...
-
自作DLLの中身を暗号化
おすすめ情報