今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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- 工学 周波数fで表現したフーリエ変換の対称性に関する質問です。 1 2022/09/14 12:27
- 物理学 相対論的運動方程式 1 2022/07/04 06:20
- 数学 dl と 、 Δl はどのように違いますか? 2 2022/11/30 15:48
- 数学 x=r・cosθの2回微分 θ=ωtとすると? 5 2022/05/10 23:53
- その他(プログラミング・Web制作) 物理の斜方投射で目盛りに数値を入れたい 2 2023/05/27 06:32
- その他(プログラミング・Web制作) 物理の斜方投射のシミュレーションにおける位置や速度の単位について 4 2023/05/31 09:50
- その他(プログラミング・Web制作) Pythonでのかんたんな物理シミュレーションについての書籍 5 2023/06/02 07:37
- 数学 dtの積分が、∫dt=t+Cとなる理由がわかりません ∫dt dtとはなりませんか? 高校生です 4 2022/11/26 12:53
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
実行後にコンパイルに失敗しま...
-
lhafileをインストールしたい
-
C言語で、配列を使ったsinカー...
-
ビープ音が鳴りません・・・
-
C#で char型とstring型の比較で...
-
変数宣言(Dim)と定数宣言(Const...
-
共有ライブラリの内容確認について
-
Linux(g++)とAIX(XL C++)の挙動...
-
シリアル通信の受信待ちについて
-
fatal error LNK1112
-
math.hに含まれる関数が使えない
-
Windowsでのスレッド間通信につ...
-
notepad++でのコンパイル設定
-
自作DLLの中身を暗号化
-
VC++6.0をコマンドプロンプ...
-
コンパイル失敗と表示されまし...
-
cc? a.out?
-
Visual studio2022 コンパイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
実行後にコンパイルに失敗しま...
-
math.hに含まれる関数が使えない
-
すべてのリビルド: 0 正常、 0 ...
-
C言語で作ったらWindowsでもMac...
-
共有ライブラリの内容確認について
-
c言語です コンパイルした時に...
-
ビープ音が鳴りません・・・
-
64ビットのlinuxで32ビットメモ...
-
C#で char型とstring型の比較で...
-
ヘッダーファイル『windows.h』...
-
lhafileをインストールしたい
-
[COBOL] ソースの復帰
-
自作DLLの中身を暗号化
-
gcc バージョン違いによるコン...
-
プレコンパイルの意味を教えて...
-
<math.h>ヘッダを入力している...
-
gcc コンパイル killed
-
Verilog_HDLでのdefineとifdef
おすすめ情報