今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ホームページビルダーでポインタが巨大化されます。

OS98「ホームページビルダー5.04」で作業していますが、画像などを移動する際、「+矢印」や「⇔」が巨大化されてしまいます。作業しづらいのでもとに戻したいのですが、方法ご存知の方教えてください。

Aベストアンサー

それは、ホームページビルダーのバグだったと思います。
(このバグが報告されているのは、WinMeだったとは思いますが)

http://www-6.ibm.com/jp/software/internet/hpb/down3.html#v5fix
ここから修正プログラムがダウンロードできます。

これで直るといいのですが・・・

参考URL:http://www-6.ibm.com/jp/software/internet/hpb/down3.html#v5fix

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

Qなぜ昆虫は巨大化すると自重で・・?

なぜ昆虫は巨大化すると自重で・・?

なぜ自重で潰れると言われるのでしょうか?
過去の同種の質問への回答を幾つか見てきたのですが、
いまいち理解できません。

脊椎動物と、外骨格の生き物の体の支え方には
どんな根本的な違いが有るのでしょうか?

酸素を体の隅々に送れないのが問題で
酸素濃度が高かった時代はその問題が低く昆虫は巨大化できた
などと言う話も聞きますが、進化で得られれば克服して
今の酸素濃度でも巨大化できたのでは・・
とも思えてしまいます。

詳しい方、何か教えて頂けますと幸いです。

Aベストアンサー

自重で潰れるとは誰の説なのでしょうか。現実に古生代には巨大昆虫が生息していましたから何の根拠も説得力もないと思います。現代に巨大昆虫が生存できないのは、酸素濃度が低いためという説が科学的には定説です。

古生代には酸素濃度は30%を超え最大で35%程度まであったと思われます。この環境では気管呼吸も十分に機能しまして昆虫も巨大になれました。しかし、その後酸素濃度が10%程度に低下したために巨大昆虫は全て死滅しました。

なぜ巨大昆虫が低酸素状態に適応できなかったのかは、関節が原因です。外骨格生物の関節は一方向にしか曲がりません。昆虫の頭部のように自由度の大きな関節は、実は小さな複数の関節の集まり、複関節から出来ています。一体節に一関節ですから複体節とも言われます。この関節部は可動部ですから運動器官以外の機能を持たせることが出来ません。ですからなるべく小さくする必要があります。しかし、小さくしますとその空間も狭まり気管も細くならざるを得ません。これが文字通りネックになりまして現世昆虫は巨大化できないのです。

解決策は複関節部を細くしないことですが、そうなりますと複関節を動かす筋や腱等も大きくしなければならず、まるで複関節のお化けのような生物になります。現実的ではないですね。小さなままでも立派に現在の地球を支配しているのですから巨大化する必要もありません。何かの参考になさってください。

自重で潰れるとは誰の説なのでしょうか。現実に古生代には巨大昆虫が生息していましたから何の根拠も説得力もないと思います。現代に巨大昆虫が生存できないのは、酸素濃度が低いためという説が科学的には定説です。

古生代には酸素濃度は30%を超え最大で35%程度まであったと思われます。この環境では気管呼吸も十分に機能しまして昆虫も巨大になれました。しかし、その後酸素濃度が10%程度に低下したために巨大昆虫は全て死滅しました。

なぜ巨大昆虫が低酸素状態に適応できなかったのかは、関節が原因です。外...続きを読む

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Q太陽の末期には巨大化し地球を飲み込むか

太陽の末期には巨大化し地球を飲み込むか
恒星の一生は末期には赤色矮星となり現在の数百倍の大きさになりその後自重力により収縮し、白色矮星にになるといことですが、巨大化した太陽は木星軌道程度まで大きくなるので地球は太陽に飲み込まれ消滅してしまう。
そこでの疑問ですが、太陽質量の増加による惑星の公転軌道に影響はないのでしょうか。
私の考えでは、質量の増加は重力の増加すなわち惑星の太陽へ引き込みが強くなる一方で、公転スピードは加速し、遠心力により軌道半径が拡大する。すなわち太陽が巨大化するにつれ惑星は太陽から遠ざかるので地球も同様で太陽に飲み込まれることはないと考えられないでしょうか。

Aベストアンサー

>赤色矮星となり現在の数百倍の大きさになり

それは赤色巨星です。「矮星」とは「小さな星」という意味です。

>自重力により収縮し、白色矮星にになる

膨れた外層が星から流れ出し、星の中心部が露出して白色矮星になります。

>巨大化した太陽は木星軌道程度まで大きくなる

大きくなるのは地球軌道くらいまで、という説もあり、まだ決着はついていないと思います。

>太陽質量の増加による

逆です。上述のように外層部が失われるので、太陽の質量は減少します(たぶん今の5~6割?になる)。

>惑星の公転軌道に影響はないのでしょうか。

あります。太陽が惑星に及ぼす引力が弱くなりますから。

>私の考えでは・・・

惑星の軌道が外側へ移動するのは確かですが、その理由は太陽の引力が強くなるからではなく、逆に弱くなるからです。極端な例として、ある瞬間に太陽の質量が零になる場合を考えましょう。太陽の引力が零になるわけですから、惑星は太陽におかまいなく、無限の彼方へ飛び去ってしまうでしょう。太陽の質量(よって引力)がじょじょに小さく(弱く)なる場合には、惑星が太陽から遠ざかる過程がじょじょに起こると考えればよいでしょう。

上述のように、太陽がどこまで膨れるかはまだはっきりわかっていないと思います。また、太陽の外層がいつどれだけ流出するかについても同様です。このような不確定なことがらのために、太陽がやがて地球を飲み込むかどうかについては、まだ断言できないと思います。

ちなみに、この問題では、太陽から流れ出す物質の中を地球が運動することの効果も考える必要があるかもしれません。地球の軌道運動は流出物質との摩擦によってブレーキをかけられます。この効果は地球を徐々に太陽に落ち込ませる方向に働きますから、地球が太陽から遠ざかるスピードを落とそうとします。

>赤色矮星となり現在の数百倍の大きさになり

それは赤色巨星です。「矮星」とは「小さな星」という意味です。

>自重力により収縮し、白色矮星にになる

膨れた外層が星から流れ出し、星の中心部が露出して白色矮星になります。

>巨大化した太陽は木星軌道程度まで大きくなる

大きくなるのは地球軌道くらいまで、という説もあり、まだ決着はついていないと思います。

>太陽質量の増加による

逆です。上述のように外層部が失われるので、太陽の質量は減少します(たぶん今の5~6割?になる)。

>惑星の公転...続きを読む

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Q小赤(餌金)の巨大化についてですが、

小赤(餌金)の巨大化についてですが、
肉食魚の餌さ用にストックしていた小赤に愛着が沸き、
育てているのですが、だんだん巨大化し(現在18cmほど)、どうせなら最大サイズを目指そうと思います。

そこで質問なのですが、
1 最大サイズはどれくらいになりますか?
2 巨大化にするためのオススメのエサはなんですか?
3 巨大化にするためのオススメ環境など何でもいいのでアドバイス下さい。

ちなみに今の環境は、
60cm水槽2匹飼いで、ヒーターなし、エサとして肉食魚のエサのキャットをあげています。(安い浮きエサを食べないので)

Aベストアンサー

金魚好きの友達のいってた話なんですが
本気ででかくするなら田んぼのような泥池に逃がすらしい、、極論ですね^^;
容器で飼うならミジンコや藻が沢山沸いてると結果がいいらしいです(物理ろ過はなしで)
見せてもらったら、20cm先の金魚が見えなかった。

一般人から見るとどっちもホント極論ですが参考になれば・・・・

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む

Q目の下に脂肪の塊?らしきもの巨大化しています

イングリッシュポインタもどきの犬でメス12歳です。
左目の下にこぶが出来ていて最初は膿のようなものがたまっていたのですがほっといたら脂肪の塊のようなものに変化し急速に巨大化して目の開閉まで困難になる状況となりました。

獣医は危険な箇所でもあり手術を遠回りに拒否。

私ら飼い主も獣医がそうならとほったらかしにしています。

このままほったらかしにしてていいものか

いちかばちかの博打で手術して取ってしまったほうが良いのか

獣医師もしくは犬の専門家の方からのアドバイスをお願いします。

Aベストアンサー

獣医師でも、専門家でもありません・・・

>獣医師もしくは犬の専門家の方からのアドバイスをお願いします。

なら、病院を変えては?
あと2,3診察を受けて 皆同じ意見なら
多分正しい判断ではないでしょうか?

>獣医は危険な箇所でもあり手術を遠回りに拒否

その理由がわからずに、診察もしないで答えられる獣医って・・・
多分全身麻酔で、切開をする事になるはずです
年齢も考慮すると・・・麻酔のリスクを避けたいんだと思います
死んじゃったら、訴えられて後が大変ですから・・・

>脂肪の塊のようなものに変化し急速に巨大化して

破裂したら大変ですよ?
部屋中に膿が飛び散って、臭くなりますよ
外犬なら、被害は抑えられますが・・・

>私ら飼い主も獣医がそうならとほったらかしにしています。

お金掛かりますよ?
そんなに安くはありません

可愛そうですが・・・ ワンちゃんは自分で病院に行けません
今まで何もしなかったのが、なぜ今になって
ご自身で言われるようなギャンブルのような手術をしようか迷うのですか?
もっと早くに迷って欲しかったです

獣医師でも、専門家でもありません・・・

>獣医師もしくは犬の専門家の方からのアドバイスをお願いします。

なら、病院を変えては?
あと2,3診察を受けて 皆同じ意見なら
多分正しい判断ではないでしょうか?

>獣医は危険な箇所でもあり手術を遠回りに拒否

その理由がわからずに、診察もしないで答えられる獣医って・・・
多分全身麻酔で、切開をする事になるはずです
年齢も考慮すると・・・麻酔のリスクを避けたいんだと思います
死んじゃったら、訴えられて後が大変ですから・・・

...続きを読む

Qg += a[i];の+=の意味とは

/* 合計点を求る*/
g = 0;
for (i= 0; i < 10; i++)
{
g += a[i];
}
以上ですが、g += a[i];の+=とはどんな意味なのでしょうか?
 よろしくお願いいたします。

Aベストアンサー

代入演算子の一種で、その左辺にある変数に、右辺にある値を加算します。
とりあえず処理としては
 g = g + a[i];
と同じ結果になります。
https://msdn.microsoft.com/ja-jp/library/5bk6ya5x.aspx

なぜ
 g = g + a[i];
でいいのにそんな書き方があるのかいうと、これだと「g の値を g に a[i] を足した値にする」という意味になるのに対して
 g += a[i];
だと「g に a[i] を足す」と意味が簡単になるためです。
……まあ、それ以外に歴史的・機械語的にこっちの方が速いという意味もあったんですが、最近のコンパイラはそのあたりを最適化するので左記の意味は薄れています。


人気Q&Aランキング

おすすめ情報