[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 13:42 / Filesize : 213 KB / Number-of Response : 830
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 27



1 名前:デフォルトの名無しさん [2008/04/29(火) 09:44:57 ]
言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 26
pc11.2ch.net/test/read.cgi/tech/1206196600/
過去スレ
makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 105代目
pc11.2ch.net/test/read.cgi/tech/1208268461/


313 名前:デフォルトの名無しさん [2008/05/04(日) 19:31:39 ]
> C:\Bディレクトリ\コンパイラ は C:\TYC4TH\gcc ってことです
その二つでためしたんですが、
gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cの場合
'gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cだと
'C:\TYC4TH\gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません


314 名前:デフォルトの名無しさん [2008/05/04(日) 19:33:02 ]
ってでます><

315 名前:デフォルトの名無しさん [2008/05/04(日) 19:39:10 ]
>>312
なんか英語がたくさんでて意味がわからない・・・


316 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:42:10 ]
日本語を含む場合は""で括る
例)gcc "C:\Bディレクトリ\コンパイラ"

>'gcc' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
gccコマンドのパスが通っていない、正しくない

317 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:49:07 ]
gccインストールしてからMinGWインストールすると
パス通すかの確認があった気がしたけど・・・
MinGWをインストールしなおして確認してみるか、
$HOME/.bashrcにexport PATH=$PATH:コンパイラの入ってるディレクトリ
を追加してみ
MinGWコンパイラの入ってるパスは$HOMEからの相対パスがいいかな

ちなみにMSYSも入れるとうれしくなれるかも

318 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:49:48 ]
>MinGWコンパイラの入ってるパスは
コンパイラの入ってるパスは

訂正

319 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:51:13 ]
>コンパイラの入ってるパスは
コンパイラの入ってるディレクトリは
打つ出し脳

320 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:51:51 ]
MinGW - Minimalist GNU for Windows
OSはWindowsじゃないの?
XP なのか 9x なのかによっても設定方法違うけど

321 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:55:06 ]
c:\autoexec.batに
PATH=c:\MinGWまでのディレクトリ\bin;%PATH%
これを書き込んで再起動すればばよかった、、、はず・・・多分



322 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:57:08 ]
折角隔離スレがあるんだから誘導しろよ。
Cygwin + MinGW + GCC 相談室 Part 3
pc11.2ch.net/test/read.cgi/tech/1177944767/

323 名前:デフォルトの名無しさん [2008/05/04(日) 20:19:39 ]
おぉ できたかもです!!
みなさんありがとうございます。
さっそく勉強してきます。

324 名前:デフォルトの名無しさん [2008/05/04(日) 20:51:46 ]
#include <windows.h>

typedef HRESULT (STDMETHODCALLTYPE *LPFNGETCORSYSTEMDIRECTORY)(LPWSTR, DWORD, DWORD *);

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
WCHAR szBuf[256];
DWORD dwLength;
HMODULE hmod;
LPFNGETCORSYSTEMDIRECTORY lpfnGetCORSystemDirectory;

               略

lpfnGetCORSystemDirectory = (LPFNGETCORSYSTEMDIRECTORY)GetProcAddress(hmod, "GetCORSystemDirectory");
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (lpfnGetCORSystemDirectory == NULL) {
MessageBox(NULL, TEXT("関数がエクスポートされていません。"), NULL, MB_ICONWARNING);
FreeLibrary(hmod);
return 0;
}
               略
}

上記のようなプログラムを見かけましたが波線の部分関数ポインタの動作いまいち理解できません。
どなたかご教示お願いします。

325 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 21:53:20 ]
>>293
以下の記述で普通に動作しています。
環境 cygwin/WindowsXP, 処理系 gcc 3.4.4
#include <stdio.h>
#define N 1024
int main()
{
char buffer[N], *p;
p = buffer;
fgets(p, N, stdin);
printf(">%s", p);
return 0;
}
/* end */
動作しないソースと環境・処理系を教えていただければ、何かわかるかもしれません。

326 名前:325 mailto:sage [2008/05/04(日) 21:54:30 ]
失礼、解決ずみでした。

327 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 01:40:56 ]
>>324
関数ポインタとは動作するものではありません
もう少し質問内容を吟味してくださらないと答えようがありません

328 名前:デフォルトの名無しさん [2008/05/05(月) 04:08:44 ]
>>81ってどうやるのかな

329 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 06:47:41 ]
>>324

何を聞きたいのか今ひとつわからんが、とりあえずMSDN。
msdn.microsoft.com/ja-jp/library/64tkc9y5(VS.80).aspx


330 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 13:03:48 ]
>>324
GetProcAddress は指定した関数へのアドレスを返すんだけど、
GetProcAddress の戻り値の型は1つに定めないといけないので
GetProcAddress は関数へのアドレスをとりあえず FARPROC って型にして返すようにしてある。
実際にこの関数のアドレスを使う際には、
本来の関数ポインタ型へとキャストして使う必要がある。

331 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 14:15:49 ]
stdlib.hにあるsystem関数って、標準ですか?
どの処理系でもまともな動作が期待できる?



332 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:04:12 ]
>>331
プログラマを目指すならもちとあいまいな問いにならないよう気をつけないと。
質問がとんでもなく飛んでいる。
どの処理系・・・列記してみて
まともな動作・・まともってなによ(この質問はちょっとあほっポイ匂い)

333 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:19:24 ]
>>331
標準じゃない

334 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:25:08 ]
>>324
このソースって凄いね(大文字ばっかで・・・w)
関数のポインターについてだけど
ポインターはアドレスを示すのは判りますね。

int body1(char* mes)
{
 printf("body1 : %s¥n", mes); return 0;
}

int body2(char* mes)
{
 printf("body2 : %s¥n", mes); return 0;
}

{
 int (*func)(char*);
 func = body1;
 func("message");

 func = body2;
 func("message");
}

みたいな。
lpfnGetCORSystemDirectory は関数へのポインターを示すけど希望するのがなければ NULL。
あとlpfnGetCORSystemDirectory() として適当に引数与えて呼び出せばいいということかな。

335 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:57:10 ]
>>331
関数そのものは標準であり、
どの処理系であろうと「処理系の考えるところのまともな動作」をする
それが「プログラマの期待するところの動作」と一致するかはわからない

336 名前:デフォルトの名無しさん [2008/05/05(月) 16:02:52 ]
ここのレス見ても何も分からないほどの初心者ですが教えてほしいことがあります。
課題でこのプログラムを組まないといけないのですが、全く分かりません。

問、二次元配列のプログラムを利用し、行列の積を計算するプログラムを作成せよ。
ただし行列a,bは以下のものを使用する。
|0 1 2| |0 3 6|
a=|3 4 5| b=|1 4 7|
|6 7 8| |2 5 8|
aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。

337 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:12:06 ]
>>336
>aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。
行列の積の定義から勉強しような。
行と列が逆だと思うぞ。


338 名前:デフォルトの名無しさん [2008/05/05(月) 16:23:36 ]
>>337
すいません。丁寧に指摘してくださってありがたいです。
一応僕が作ったプログラムを載せておきます。
#include<stdio.h>
main(){
int a[3][3]={{0,1,2},{3,4,5},{6,7,8}};
int b[3][3]={{0,3,6},{1,4,7},{2,5,8}};
int c[3][3]={0};
int i,j;


for(i=0;i<3;i++){
for(j=0;j<3;j++)
c[i][j]=a[i][j]*b[i][j];}
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d ",c[i][j]);
printf("\n");
}}
足し算をするプログラムの演算子を+から*に変えただけなので積が出来るわけもないのですが、
どうすればよいのでしょうか、あつかましいですがよろしくお願いします。

339 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 16:28:36 ]
(っ´▽`)っ
#include <stdio.h>

int main(void)
{
  int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
  int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}};
  int ab[3][3];
  int i;
  int j;
  int k;
  for(i = 0; i < 3; i++){
    for(j = 0; j < 3; j++){
      ab[i][j] = 0;
      for(k = 0; k < 3; k++){
        ab[i][j] += (a[i][k] * b[k][j]);
      }
    }
  }
  return 0;
}

答えは{{5, 14, 23}, {14, 50, 86}, {33, 86, 149}

340 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:29:04 ]
>>338
行列の掛け算は3重のループになるのだぞ。行列を勉強しましょう。


341 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:30:14 ]
for(n = 0; n < 3; n++){
for(m = 0; m < 3; m++){
for(i = 0; i < 3; i++) c[n][m] += a[n][i] * b[i][m];
}
}

こんな感じ?





342 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 16:33:49 ]
>>338
(っ´▽`)っ
x行n列の行列Aのi行j列成分をa(i, j)、
n行y列の行列Bのi行j列成分をb(i, j)、
ABのi行j列成分をab(i, j)と表示するとき、

ab(i, j) = Σ(k=1→n)a(i, k)b(k, j)

線形台数の教科書を見直せ☆

343 名前:デフォルトの名無しさん [2008/05/05(月) 16:51:00 ]
>>339->>342
初歩的なことなのにわざわざ教えてくださってありがとうございます。
感謝しています。
あとほんとに初心者的なことなんですが、>>339さんのプログラムで計算は出来ました。
しかし答えを表示させようと思ったら、なんか変な結果になりました。
以下プログラムと結果です。
(最初のほうは省略)
for(i = 0; i < 3; i++){
    for(j = 0; j < 3; j++){
      ab[i][j] = 0;
      for(k = 0; k < 3; k++){
        ab[i][j] += (a[i][k] * b[k][j]);
      printf("%d ",ab[i][j]);}
    }
  }
  return 0;
}
結果
0 1 5 0 4 14 0 7 23 0 4 14 9 25 50 18 46 86 0 7 23 18 46 86 36 85 149


344 名前:デフォルトの名無しさん [2008/05/05(月) 16:52:39 ]
>>342
ゆとり乙
数学3cのレベルです

345 名前:344 [2008/05/05(月) 16:54:36 ]
>>342
ごめんなさいゆとりは俺でした
数学3cじゃねええええええええええ
あああああああああああああ何か勘違いしてたああああああああ

346 名前:344 [2008/05/05(月) 16:55:21 ]
やべえ今までで一番恥ずかしい書き込みだ

347 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:55:51 ]
最近Cを始めた者なんですが
CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
ポインタを使うような関数を自分で作る必要がありますか?
何かサンプルなどもありましたらお教えください。

348 名前:336 [2008/05/05(月) 16:55:51 ]
僕はちなみに本当のゆとりです。

349 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:56:55 ]
落ち着け
寿司食うか?

350 名前:344 [2008/05/05(月) 16:58:16 ]
大体3cとかあんまりやってねぇんだよ・・・
ケーリーはミルトンの公式ばっかり使って足し算引き算ぐらいだっけ?
行列式はなかったよな・・・あぁ・・・俺なにやってんだろう

351 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:58:59 ]
>        ab[i][j] += (a[i][k] * b[k][j]);
>      printf("%d ",ab[i][j]);}

                   ~~~

中括弧の位置




352 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:03:14 ]
>>343
(っ´▽`)っ
printfを最も内側のループの外に出せ☆

#include <stdio.h>

int main(void)
{
  int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
  int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}};
  int ab[3][3];
  int i;
  int j;
  int k;
  for(i = 0; i < 3; i++){
    for(j = 0; j < 3; j++){
      ab[i][j] = 0;
      for(k = 0; k < 3; k++){
        ab[i][j] += (a[i][k] * b[k][j]);
      }
      printf("%d\t", ab[i][j]);
    }
    printf("\n");
  }
  return 0;
}

353 名前:344 [2008/05/05(月) 17:05:08 ]
ああああああああああああああああああああああ

354 名前:344 [2008/05/05(月) 17:06:41 ]
ダメだ・・・

355 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:08:02 ]
五月蝿い
トイレでも篭ってろ

356 名前:344 [2008/05/05(月) 17:08:42 ]
線形台数の教科書読んできますノシ

357 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:10:23 ]
>>347
>CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
ない
>ポインタを使うような関数を自分で作る必要がありますか?
ある

文字列操作の概念自体が違うので、CでVBのようなことをやるという考え自体を捨てること
まずCのやりかたというものを覚えるのが先

358 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:12:08 ]
>>347
(っ´▽`)っ
b = LEFT(a, n)

strncpy(b, a, n);
b[n] = '\0';

b = MID(a, m, n)

strncpy(b, &a[m-1], n-m+1);
b[n-m+1] = '\0'
で。

359 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:13:30 ]
(っ´▽`)っ
最後セミコロンが抜けたが気にしない☆

360 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:14:05 ]
>>347
>CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
どちらもsprintf()で代用可能。

361 名前:336 [2008/05/05(月) 17:14:14 ]
>>351->>352
おかげさまでうまく答えも出ました。本当にありがとうございます。




362 名前:344 [2008/05/05(月) 17:14:54 ]
>>361
俺と一緒に勉強しようぜ

363 名前:347 mailto:sage [2008/05/05(月) 17:17:36 ]
>>357-360
ご回答ありがとうございました。
サンプルを参考にしながらC勉強をしていきます。

364 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:23:39 ]
(っ´▽`)っ
正確には
(っ´▽`)っ
b = LEFTB(a, n)

strncpy(b, a, n);
b[n] = '\0';

b = MIDB(a, m, n)

strncpy(b, &a[m-1], n-m+1);
b[n-m+1] = '\0';
だ。

strncpyの第3引数はバイト数。
LEFTとMIDを使いたければwcsncpyを使えばいいような気がする。

365 名前:336 [2008/05/05(月) 17:35:16 ]
>>362
共にがんばりましょう。

366 名前:デフォルトの名無しさん [2008/05/05(月) 17:44:26 ]
 unsigned __int32 hentai, doutei;
 hentai = 293317826;
 doutei = 899523;

仮に上のように hentai と doutei に格納された数値において、
hentai += doutei;  // 293000000 + 899253
のように hentai の下6桁を0にして doutei を加算し、下6桁を doutei にしたい。

条件は
if ( hentai > doutei &&
  doutei >= 0 &&
  doutei < 1000000)

で、思いついたのが
hentai = ((hentai / 1000000) * 1000000) + doutei;

納得がいかないのでスマートなやり方教えてくれ。

367 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:50:49 ]
>>366
十分スマートと思うが、どういう点で納得がいかないんだ。

hentai += doutei - hentai % 1000000;

368 名前:デフォルトの名無しさん [2008/05/05(月) 17:58:57 ]
>>367
おお、サンクス。
除算か乗算どちらかを一回でも削りたかったんだ。

369 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 21:57:45 ]
>>363
Basic系から来た人だと right とかも使うんでしょw・・それは置いといて無いものは自作するってのも楽しみじゃないかいな?

>>360
参考までに書いてくれると周りも参考になるとおもう。
せいぜい数行だと思うから sprintf で書いてみてよ。


370 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 22:12:13 ]
>>369
360じゃないが、こうじゃないかな。
char* left(char *dst, const char *src, int count)
{
sprintf(dst, "%.*s", count, src);
return dst;
}
char* mid(char *dst, const char *src, int pos, int count)
{
return left(dst, src+pos, count);
}


371 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:40:11 ]
C言語用でお勧めのフリーコンパイラを教えてください



372 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:43:44 ]
>>370
おお、%.*s ・・・しらなんだ。

373 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:47:34 ]
>>371
・ GCC (MinGW)
・ Microsoft Visual C++ Express Edition 2008
好きなの選べ

374 名前:デフォルトの名無しさん [2008/05/06(火) 00:05:01 ]
>>373
その2つの違いがまったくわかりません…
それとMSの方はC++となってますがC言語にも対応してるんですか??

375 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:08:44 ]
おまえは紹介されたコンパイラについてちゃんと調べたのか?

376 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:09:31 ]
>>374
MSのコンパイラでもCのコンパイルはできます。但し、99年の規格にさえ準拠していないので注意が必要です。
gccは、Cコンパイラではなくコンパイラコレクションです。勿論、CもC++もコンパイルできます。
まぁ、MinGWにしろCygwinにしろ、環境に対する知識が必要にはなります。

377 名前:デフォルトの名無しさん [2008/05/06(火) 00:24:49 ]
fputc( )の使い方の説明で

int fputc(int 文字、FILE *ストリーム);

fputc( )関数は、「文字」の下位バイトを、「ストリーム」に結び付けられているファイルにunsigned char型の値として書き込みます。

とあるんですが、上位バイトはどうなるんですか?

378 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:25:59 ]
捨てられる

379 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:26:49 ]
ttp://www.bohyoh.com/CandCPP/C/Library/fputc.html

380 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 08:01:36 ]
vistaで動くコンパイラだったら何がいい?
やっぱりbcc、gcc辺りかな

381 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 09:42:29 ]
VC++ 2008 Express Edition



382 名前:デフォルトの名無しさん [2008/05/06(火) 09:53:56 ]
uint16 とか uint8 とかは int とどう違うのですか?

使い方を教えてください。

383 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 09:54:04 ]
Express Editionとgccの好きな方

384 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 09:56:25 ]
uint16_t や uint8_t なら標準(C99)で用意されているが
uint16 や uint8 は標準では用意されていない。

385 名前:382 [2008/05/06(火) 09:59:52 ]
>>384
もう少し詳しくお願いします。

386 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:11:53 ]
>>385
標準で用意されてない以上、
ヘッダファイル内にある定義を見てくださいとしか言いようが無い。

387 名前:382 [2008/05/06(火) 10:22:11 ]
>>386
ということは・・・

uint16 uint8 はwindows.hとかでも定義されてる分ではなく、

自分の使っているライブラリかなにかで定義されているということですね。

わかりました。 調べてみます。

388 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:24:30 ]
>>387
windows.hにあるかもしれませんが、そこにあったとしても標準とは言えません。
そもそも、あなたがWindowsを使っているのかどうか誰にもわかりませんから。

389 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:25:09 ]
処理系独自に定義されてるかもしれないが、
どの処理系使ってるかも知らんし、
結局自分で調べてくれ、というこった。

390 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 13:51:05 ]
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram hist);

int main (void){
struct histgram hist;
int z;
hist.x = 0;
for(z=0;z<100;z++){
hist.y[z]=0;
}
printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
one(hist);
printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
for(z=0;z<9999999999;z++);
return 0;
}

void one(hist){
two(hist);

void two(hist){
int z;
hist.x = 1;
for(z=0;z<100;z++)hist.y[z]=1;
}
とするとtwo(hist)でエラーが起きます。なぜでしょうか?

391 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 13:57:38 ]
すいません、解決しました。



392 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:00:16 ]
INT_MAX 4bites = 2147483647 < 9999999999

393 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:02:26 ]
やっぱうまくいきません。
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram hist);

int main (void){
struct histgram hist;
int z;
hist.x = 0;
for(z=0;z<100;z++){
hist.y[z]=0;
}
printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
two(hist);
printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
for(z=0;z<9999999999;z++);
return 0;
}
void two(struct histgram *hist)
{
int z;
hist->x = 1;
for(z=0;z<100;z++){
hist->y[z]=1;
}
}
は何がいけないのでしょうか?

394 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:04:25 ]
two()は構造体のポインタを受け取る関数
main()で呼んでるtwo()に渡されてるhistは構造体そのもの

あと>392

395 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:06:22 ]
bites …くそorz

396 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:11:21 ]
Winでコマンドプロンプトがすぐ終了するのを抑止したいなら、scanf("%*s"); がいい

397 名前:393 mailto:sage [2008/05/06(火) 14:11:59 ]
www9.plala.or.jp/sgwr-t/c/sec15-4.html
ここに、393のようにかけと書いてありました…

393を書き直した正解はどうなるのでしょうか?

グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
処理された任意の変数をn個、n-1個上の階層で使用したいのですが


398 名前:393 mailto:sage [2008/05/06(火) 14:12:39 ]
>396
ありがとうございます。使ってみます。

399 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:17:24 ]
#define ZETTAI(x) (x < 0) ? -(x) : x

int x;

x = ZETTAI(-9 - 50) + 5;

これでxの中身が59になってしまうのですが、何故でしょうか?
-59をZETTAIで59にした後、5を加算しているはずなのですが

400 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:17:47 ]
>>.397
そこの二つ目のの「seito2」は構造体の配列名。配列名は大抵の場合すぐポインタに成り下がるので、
ポインタを引数としてとるseidesp2()にそのまま渡すことができる。
>>393 の場合histは構造体の単体だから、two(&hist) として呼び出さなければならない。

>グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
>処理された任意の変数をn個、n-1個上の階層で使用したいのですが
言ってる意味がよくわからないが、1つの構造体のデータを再帰的に処理したいのなら構造体のポインタを渡す。

401 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:21:07 ]
コンパイラのエラーメッセージをちゃんと読め。
プロトタイプ宣言と定義が噛み合っていないぞ。
void two(struct histgram hist);
void two(struct histgram *hist)...




402 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:23:09 ]
>>399

x = ZETTAI(-9 - 50) + 5; 

↑は↓のように展開されるから。

x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;

これはもちろん

x = (-59 < 0) ? 59 : -54;

と解釈されて、xには59が代入される。

マクロZETTAIの正しい宣言は下のようになる。

#define ZETTAI(x) ((x < 0) ? -(x) : x)

もちろん自作などせずにライブラリ関数を使うことが望ましい。

403 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:23:31 ]
>>399
#define ZETTAI(x) (x < 0) ? -(x) : x

#define ZETTAI(x) (((x) < 0) ? -(x) : (x))
にしておてきなさい。


404 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:30:39 ]
>>402-403
上手くいきました
ありがとうございます

ですが、
>x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;
同じxなのに何故一番右のxだけに+5がくっつくのですか?

405 名前:393 mailto:sage [2008/05/06(火) 14:30:43 ]
すいません、結構理解に手こずってます。
配列でなく、実体を受け渡しする場合は、
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram *hist);
int main (void){
struct histgram hist;
int z;
hist.x = 0;
printf("before***%d***%d***%d***",hist.x);
one(&hist);
printf("before***%s***%s***%s***",hist.x,hist.y[0],hist.y[50]);
return 0;
}
void one(struct histgram hist){
two(&hist);
}
void two(struct histgram *hist){
int z;
hist->x = 1;
}

だと思ったのですが、error C2440: '関数' : 'histgram *__w64 ' から 'histgram' に変換できません。
というエラーが出てしまいました。

406 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:36:01 ]
>>404
元のx=の式の一番右の+5がそのまま残っているだけ。

407 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:36:58 ]
>>405
構造体をそのまま渡したいのであれば、アンパサンドをつけてはいけません。

408 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:40:42 ]
>>406
つまり
#define ZETTAI(x) (x < 0) ? -(x) : x を
#define ZETTAI(x) ((x < 0) ? -(x) : x) に変えると

x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5; が
x = ((-9 - 50 < 0) ? -(-9 - 50) : -9 - 50) + 5; になるということですね?

#define ZETTAI(x) (((x) < 0) ? -(x) : (x)) だと
x = (((-9 - 50) < 0) ? -(-9 - 50) : (-9 - 50)) + 5; ですね!

理解できました
丁寧にありがとうございました

409 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:40:56 ]
まぁ、あんなサイトを見ているようじゃいつまでたっても理解できないわな。

410 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:29:22 ]
いいから黙ってstdlib.h::abs()を使え

411 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:49:43 ]
やっぱ自作するより、ライブラリ探したほうがいいのかな



412 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:56:26 ]
absはintだから・・・

413 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:56:59 ]
そりゃそうだが基本的なパーツの使い方を勉強してる初心者にそれは野暮な突込みだ。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<213KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef