C言語なら俺に聞け( ..
494:487
10/04/27 13:33:20
皆さん、ありがとうございます。
>>490
まさにIO制御の学習です。
基盤にランプが8個乗っていて、指定のIOポート1つ(1バイト)に値をセットすることで点灯/消灯を制御するといった課題です。
ビットフィールドというのを調べてみます。
>>492
前者は、指定したビットが0のときは0が返るけれど、1のときは1<<nが返りますね。
それでも、このメソッドを使う際に、「0かそうでないか」という運用をすれば良いということですか?
JavaのbooleanやC#のbool型に慣れているゆえ、0か1かの戻り値にこだわらないといけないと思っていましたが、
Cの常識だとそうでもないという認識で良いですか?
後者は、「src & ~(1 << n) | (!!param << n);」の記述の意味を詳しく教えていただけると助かります。
「src & ~(1 << n)」の部分までは、「とりあえず指定ビットを0にする」というのは分かりますが、
その後、 !!とはどういう意味の記述なのでしょうか。
こういう短く基本的な処理を書くにはinlineにしたほうが高速なのですね。とても参考になります。
495:デフォルトの名無しさん
10/04/27 13:38:56
ビットフィールドの実装依存の部分からいってその用途には使えないんじゃないの?
パディングとか順番入れ替わるとかで
496:デフォルトの名無しさん
10/04/27 13:46:15
>>494
>>492の get の方は指摘の通りで、0, 1 に固定するなら(した方がいいだろうけど)、
return !!(src & (1 << n));
としてもいいが、それなら >>493 の方がいいね。
!! は ! を2回やってるだけ。 0なら0、0以外なら1にしたいときにやる常套手段。
497:デフォルトの名無しさん
10/04/27 14:15:09
>>487の判定文、演算子の優先順位をよく調べとけ
498:デフォルトの名無しさん
10/04/27 14:28:54
>>494
JavaでもC#でも0が偽というところは変わらんよ。
if (3)とかかけるでしょ
499:デフォルトの名無しさん
10/04/27 15:34:56
>>498 嘘
500:デフォルトの名無しさん
10/04/27 15:42:12
JARO
501:デフォルトの名無しさん
10/04/27 18:54:10
!!はキモいんだよなあ
好みの問題だろうけど
ちゃんと最適化されるかどうかは気になる
502:デフォルトの名無しさん
10/04/27 19:14:22
!!がいやなら!=0はどうよ?
503:デフォルトの名無しさん
10/04/27 19:20:04
>>485
なるほど、「静的記憶域区間」のみならず「自動記憶域区間」の場合であっても、初期化という言葉が適用されるのですね。
インプリメント上では単なる代入にすぎないものであっても。
504:デフォルトの名無しさん
10/04/27 19:53:57
C++で挫折してCに流れ着いてCの入門書読み終えたんですが、中級者になるために試したらためになる演習課題とかありませんか
たぶんメモ帳とか作る場合GUIとか使わないとならないんですよね?できたらヒント付きで教えてくれませんか?
505:デフォルトの名無しさん
10/04/27 19:54:16
>>502
俺は基本そうしてる
if文に直接書く時はそれすら書かないけど
506:デフォルトの名無しさん
10/04/27 19:55:02
>>504
CUIで作れるような簡単なゲームでも作るといいよ
俺はいつもヒットアンドブローを作るようにしている
507:デフォルトの名無しさん
10/04/27 22:01:56
構造体のメンバに順次アクセスする
ナイスな方法ってある?
508:デフォルトの名無しさん
10/04/27 22:10:36
char*でキャストして、1バイト毎に順次アクセスする
509:デフォルトの名無しさん
10/04/27 22:14:11
メンバの位置や型を配列にして保存しておいて
それでループでアクセス
まあ普通そんなことやるなでFAだが
510:デフォルトの名無しさん
10/04/28 15:43:35
>>507
unionを使うのが一番楽で上品
511:デフォルトの名無しさん
10/04/28 16:33:51
>>510
順次アクセスという言葉の意味がわかってないだろ
馬鹿は黙ってればいいのに
512:デフォルトの名無しさん
10/04/28 17:14:46
順次アクセスできない理由を教えてくれ天才
513:デフォルトの名無しさん
10/04/28 19:37:37
>>511
こういう感じでいけるっしょ。
typedef struct {
int a;
int b;
int c;
int d;
} hoge_t;
typedef union {
hoge_t u;
int l[4];
} chinko_t;
514:デフォルトの名無しさん
10/04/28 19:38:41
あ、int l[0] にしといた方が便利がいいな。
515:デフォルトの名無しさん
10/04/28 20:07:29
アラインメントが気になる
同じ型ならまず問題は無いだろうが、万が一があるしな
516:デフォルトの名無しさん
10/04/28 20:14:52
メリット皆無だし。
517:デフォルトの名無しさん
10/04/28 20:16:54
>>515
それを言い出したらそもそもunionの存在そのものが怖いよな。
>>516
誰もメリットの話なんかしてねーだろ
518:デフォルトの名無しさん
10/04/28 20:26:35
添え字でアクセスしたいだけなら
#define STFX(N,V) switch(N){case 0:struct.a=V;break;case 1:〜}
で十分だし。
519:デフォルトの名無しさん
10/04/28 21:01:43
おいおい今日もまたCの連中はつまんねえことでもめてるよww
520:デフォルトの名無しさん
10/04/28 21:10:53
>>519
だよな、時代はD言語だろうに老頭児なC厨はオナニーでもしてろってのw
521:デフォルトの名無しさん
10/04/28 21:12:26
これだからC厨は・・・
522:デフォルトの名無しさん
10/04/28 21:12:59
D(笑)
523:デフォルトの名無しさん
10/04/28 21:14:18
おじいさまがたはFORTRANでも使っててください
524:デフォルトの名無しさん
10/04/28 21:14:28
老頭児って中国語か
525:デフォルトの名無しさん
10/04/28 21:18:30
おじいさまがたは LISP でも使ってください、
ん?
526:デフォルトの名無しさん
10/04/28 21:24:39
>>523,525
すまん、俺まだ20代だが両方とも会社で使ってるw
527:デフォルトの名無しさん
10/04/28 21:32:21
LISPは未だに超強力だからな。まあWindowsアプリに限って言うならC#の時代が来るかもしれない。囲い込みだしな
でもプログラムはWindowsアプリだけじゃないし、つーかDって誰が普及させるんだよw
世界中で使われてるCの牙城を崩す気ねーだろ
あとWebプログラミングのLLはこれからも生き残る
528:デフォルトの名無しさん
10/04/28 21:35:21
LISPはemacsとかあるからまぁ使う機会はそこそこあるかもしれんが
FORTRANを使う場面はまったく思い浮かばん
昔大学で実験に使って以来やってないから、もう文法もわがんね
529:デフォルトの名無しさん
10/04/28 21:49:20
順次アクセスとかそんなイレギュラーな使い方は普通しないし。
530:デフォルトの名無しさん
10/04/28 22:02:10
Fortranは大学ではまだつかってるところあるけど
Lispってemacsのマクロくらいしかないよ
って書こうとしてリロードして>>528を読んだ
たぶんほとんど同じものを見たのに出した答えが真逆で面白いなと思った
531:デフォルトの名無しさん
10/04/28 22:25:40
構造体の入れ子ってあまりよくないことなんでしょうか?(設計に問題あり?)
532:デフォルトの名無しさん
10/04/28 22:27:57
別に普通
533:ノラ
10/04/28 23:55:51
いま学校の課題で
do-while文を使って
1+2+3・・・というように数値を加算して表示し、
加算結果が300を超えたら表示して
処理を終了するというプログラムを組みたいのですが、
普段から授業ついていけなくて、よくわかりません
どなたか教えてください。お願いします
534:デフォルトの名無しさん
10/04/28 23:57:45
>>533
ここは入門スレなのであまり高度なことはお答えできません。
535:ノラ
10/04/29 00:00:38
>>534
どうしたらいいですか?
536:デフォルトの名無しさん
10/04/29 00:02:05
中学校の課題?
537:ノラ
10/04/29 00:03:53
>>536
いえ専門なんですが
全く授業についていけなくてですね・・・
538:デフォルトの名無しさん
10/04/29 00:03:56
>>535
スレリンク(tech板)
こちらへどうぞ
539:デフォルトの名無しさん
10/04/29 00:04:27
#include <stdio.h>
int
main(void)
{
int i = 1;
int sum = 0;
do {
sum += i++;
} while (sum < 300);
printf("%d\n", sum);
return 0;
}
540:デフォルトの名無しさん
10/04/29 00:04:29
そういうときは美味しいカレーのレシピを書いて提出だろう
541:ノラ
10/04/29 00:12:06
>>539様ありがとうございます。
参考にしてがんばってみます
542:ノラ
10/04/29 00:14:24
>>539
sum入れないでもできますか?
543:デフォルトの名無しさん
10/04/29 00:16:16
ついていく気は無いようだwww
544:デフォルトの名無しさん
10/04/29 00:24:11
>>542 自分でやれよカス
545:デフォルトの名無しさん
10/04/29 00:52:38
>>542
#include <stdio.h>
int
main(void)
{
int i = 1;
do {
printf("%d\n", i * (i + 1) / 2);
i++;
} while (i * (i + 1) <= 600);
return 0;
}
546:デフォルトの名無しさん
10/04/29 00:55:13
>>542
結果を格納しておく変数が必要なわけ。
加算していって、それをどこに保持しておくの?って話になるでしょ?
だから、この場合は「sum」っていうy変数に入れてる。
別にgoukeiでもsでも、C言語の規則に従ってればなんでもいい。
547:デフォルトの名無しさん
10/04/29 00:55:55
>>545
綺麗だけど初心者には分かりづらいソースだなwwwwwwwwww
548:デフォルトの名無しさん
10/04/29 01:03:48
まて、少なくとも綺麗ではない
549:デフォルトの名無しさん
10/04/29 01:16:39
この手の問題は、答えが分かるのなら質問しない。つまり初めから論外なレベル
宿題スレじゃないんだからさ
550:デフォルトの名無しさん
10/04/29 02:39:15
ちょっと質問なんですけど。。。
Raw Socketってあるぢゃないですか?
私の開発環境はWindowsでVC++ 2008なので
Winsock2を使ってws2_32.libをリンクし、
socket(AF_INET,SOCK_RAW,IPPROTO_IP);
こうやって書くんだと思うんですが(違ったらまた勉強してきます)、
IPヘッダを作成するときにIPを偽装できるという記事を
拝見したことがあります。
その場合、IPというのは何のIPなのでしょうか?
プライベートIPですか?
グローバルIPですか?
仮にグローバルIPを返られるとした場合、
例えば携帯IPに変更することは可能なのですか?
もし可能なら大変なことになるのでそれは出来ないと思うのですが、
出来たとしたら掲示板などはどのような対策を施すのでしょうか?
■以下、板違い発言すみません。
私はC言語のほかにPerlやPHPなどCGIで掲示板などを作成してます。
もし上記に書いたようなグローバルIPを偽装するような行為があったとしたら
どのように防げばいいかわかりません・・・
できればそんなこと出来ないものだと願いたいものです。。。
551:デフォルトの名無しさん
10/04/29 06:42:02
>>550
スレチとか死ねよゴミ野郎
IPの偽装は現在は無理
一言でいうとヘッダに書いてあったIPに本当にそいつが送ってきたのか確認するから
それとグローバルIPですかプライベートIPですか?って質問も相当アホ
552:デフォルトの名無しさん
10/04/29 09:19:03
グローバルだよ (LAN内にサーバもあるならローカルでもいいけど)
携帯のふりもできるよ 掲示板は対策要らないよ
あんたの掲示板はTCPだろうから>>551が言うようにそのIPに対して問い合わせするわけだから
偽装された他人に問い合わせしても返事来ないでしょ
UDPで動く(昔のネットゲームとか?)ものなら がんばって通信内容もまねれば
他人がゲームやってるときにちょっかい出せるかもしれんけど
553:デフォルトの名無しさん
10/04/29 15:12:39
すみません、矩形画像出したくて以下のを書いてみたんですが画像が表示されません。
誰かお願いします。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char fi[50];
float buff[128*128];
int nx = 128, ny = 128;
int i, j;
FILE *fp;
// 画像の初期化
for (i = 0 ; i < nx*ny ; i++)
buff[i] = 0;
554:デフォルトの名無しさん
10/04/29 15:14:47
// 矩形画像の作成
for (i = 32 ; i <= 96 ; i++) {
for(j = 32 ; j <= 96 ; j++) {
buff[i*nx+j] = 100;
}
}
// 画像の書き出し
printf( "Input new file name: " );
scanf( "%s", fi );
if ((fp = fopen ( fi, "wb")) == NULL) {
printf("Error: file open [%s].\n", fi);
exit (1);
}
fwrite(buff, sizeof(float), 128*128, fp);
fclose (fp);
}
555:デフォルトの名無しさん
10/04/29 15:22:34
どこそこがおかしいと言うレベルじゃなくめちゃくちゃなんだが
お前それ本とかみてやってそうなのか?
556:デフォルトの名無しさん
10/04/29 15:28:34
>>553
画像ヘッダをつけるかフォーマット指定してビューワに読み込ませれば表示できるかもしれない
ACDSEE とかそういうの
float 型の画像ってことはCTスキャンデータかな?
後輩だったりしてw
557:デフォルトの名無しさん
10/04/29 15:29:11
ウィンドウに絵を表示したいの?それとも画像ファイルを出力したいの?
前者ならまずウィンドウを作成しないと。
後者なら出力したい画像フォーマットに従ってデータを出力しないとダメだよ。
558:デフォルトの名無しさん
10/04/29 15:46:14
>>557
とりあえず raw形式でいいんじゃない?
559:デフォルトの名無しさん
10/04/29 16:11:29
釣りにつられたようだ
560:デフォルトの名無しさん
10/04/29 16:37:32
>float 型の画像ってことはCTスキャンデータかな?
先輩、今時CTのデータが128ってことはないでしょ
ネマコードもないし DICOM形式でもない
561:デフォルトの名無しさん
10/04/30 09:51:52
ヘリカルスキャンCTの場合で、512x512x200くらいは平気でありそうだ。
つーか、float生データでも適切なツールを使えば表示はできるだろうけどね。
いずれにしても、Cの話じゃなく画像フォーマットの話というか仕様の解釈の話だ。
562:デフォルトの名無しさん
10/04/30 10:53:29
ヘリカルCTなら512x512x320くらいデフォだけど
型はshortだな
563:デフォルトの名無しさん
10/04/30 11:15:48
結局文型が業界にたくさん入ってきて保身に全力だからじゃないの?
あいつら技術的なこと分からないから技術持ってるベテランにいてもらうと邪魔なんだよ。
そいうやつらが外注管理とか客先交渉とかの技術的なこと分からなくてもできる仕事を創出してこの業界で生き残れるシステムを作ったんじゃないだろうか。
技術のない正社員はすぐ首にできるシステムになってないのがいけないんだと思うんだ。
だいたい技術職なのに技術にこだわってるやつを軽蔑する空気があるのはおかしいと思う。
564:デフォルトの名無しさん
10/04/30 11:18:53
誰かが言った、偉大なる素人集団だと。
565:デフォルトの名無しさん
10/04/30 12:00:27
そういう時、アメリカなら技術者だけが出て行って別会社を作る
たとえばintelの技術者が「もっとすごいCPUを作りたい」といって、独立して作った会社がAMD
ただし営業力がなくて負ける
566:デフォルトの名無しさん
10/04/30 13:33:12
でもさ、反論を覚悟で書くけど
技術が高くてもメシは食えないんだよね
でも営業が小ざかしいくらい上手いと技術がクソでも売れる
メインな部分どっかに丸投げでもOK
宣伝の上手い声の大きいやつが勝つ
あと、技術持ってないやつが上にいたりすると楽だよね
「あ、それ2週間はかかります」とかどう考えても5分で終わる仕事でも平気でそんな事いってみたり
ある程度技術があるようならバレバレでもさ
(「そんなことしてるお前がクソなんだよ」って言われちゃうだろうな)
567:デフォルトの名無しさん
10/04/30 13:35:19
お前らマ板に帰れよ
568:デフォルトの名無しさん
10/04/30 13:39:55
>>566
上が技術だとある意味もっと楽だぞ。
こっちの話がちゃんと伝わるから、更に上にリソースの確保をきちんと交渉してくれる。
尤も、弊社の場合No.2まで技術系だから突っ込まれたときはやばいw
569:デフォルトの名無しさん
10/04/30 13:40:35
いい加減巣に帰れよ
570:デフォルトの名無しさん
10/04/30 13:41:26
>>569
スレ違いの雑談と言う意味ではあんたも同罪。
で、Cの初歩的な質問未だ?w
571:デフォルトの名無しさん
10/04/30 13:43:10
reallocって失敗したら元のデータはどこかへ消えてしまうんですか?
そのあたりがよくわかりません
572:デフォルトの名無しさん
10/04/30 14:07:53
>>571
お前にわかる必要など無い
573:デフォルトの名無しさん
10/04/30 14:09:40
>>571
宇宙の法則がみだれるからな・・・
574:デフォルトの名無しさん
10/04/30 14:54:33
>>571
大丈夫。realloc()はメモリ確保に成功しない限り元の領域は解放しない。
つまり、使う側が間抜けでない限りどこにも消えはしない。
575:デフォルトの名無しさん
10/04/30 15:10:13
>>574
回答ありがとうございます
reallocに与えるアドレスをとっておいて、reallocがNULLを返したらそっちを取り扱えばいいってことですね
とはいえ今まで一度もmalloc系が失敗するとこをみたことないんですけどね
576:デフォルトの名無しさん
10/04/30 15:57:46
>>575
いつ失敗するんだろうと思って延々mallocをしてみるのが普通のマ。
577:デフォルトの名無しさん
10/04/30 15:59:32
まぁ確かに。標準設定のままのLinuxだと楽観的メモリ管理を採用しているから
以上に大きな値を指定しない限り、メモリが足りようと足りなかろうとNULLは返さないからね。
で、実際に使おうとしたときに足りなくなるとプロセス落として知らん顔w
578:デフォルトの名無しさん
10/04/30 16:09:09
カーネルパラメータいじる前にメモリを増設します
579:デフォルトの名無しさん
10/04/30 16:12:07
じゃあ俺は64bitLinuxにしてかつスワップもりもりにする
580:デフォルトの名無しさん
10/04/30 16:17:50
Linuxのソースを改造してメモリ管理を改善させます。
581:デフォルトの名無しさん
10/04/30 16:20:17
なにを改善するんだろ。楽観的メモリ管理をやめるために改造するはずはないし
582:デフォルトの名無しさん
10/04/30 16:24:21
楽観的メモリ管理をやめたいだけなら設定変更するだけじゃなかったっけ?
まぁ、Linux板向けの話だね。
583:デフォルトの名無しさん
10/04/30 18:39:33
/proc/sys/vm/overcommit_memory
584:側近中の側近 ◆0351148456
10/04/30 19:19:45
>>575
(っ´▽`)っ いや、異常終了にしたほうがいいんじゃね?
alloc系がエラー返すって相当やばいから、処理続行するのは危険だね。
585:デフォルトの名無しさん
10/04/30 20:19:21
reallocしたい場面にもかかわらず、reallocに失敗しても続行できる場面が想像しがたいけど、
続行できるのなら続行してもいいと思うよ。
ほんとに必要な場面で失敗したなら異常終了で。
586:デフォルトの名無しさん
10/04/30 20:23:22
そういう場面では、キャッシュとして確保しっぱなしのメモリを開放とかじゃないかなあ・・・
587:デフォルトの名無しさん
10/04/30 21:20:56
つか、実際そういう時って
固まっちゃって動かなくて、引き続き他の動作もクソもないよな
588:デフォルトの名無しさん
10/04/30 21:44:01
Hello, world!
の出力を21byteで思いつける天才いる・・・?
code golfです。
URLリンク(golf.shinh.org)
589:デフォルトの名無しさん
10/04/30 21:48:52
なんでgorubyがあってHQ9はないんだろうな
590:588
10/04/30 21:53:43
あ〜・・・
C言語ね・・・
591:デフォルトの名無しさん
10/04/30 22:04:09
>>588
#include使ったチート技じゃないかい?
592:側近中の側近 ◆0351148456
10/04/30 22:05:45
>>588
(っ´▽`)っ
#error Hello, world!
593:デフォルトの名無しさん
10/04/30 22:16:04
側近ってこんなところにも来るんだ・・・
今日のアキバにしか存在できないと思ってた
594:デフォルトの名無しさん
10/04/30 22:16:23
>>592
側近死ね
595:デフォルトの名無しさん
10/04/30 22:17:24
安価同じw
596:デフォルトの名無しさん
10/04/30 22:30:57
側近マジ死ねよ消えてくれ。ウザい。
597:デフォルトの名無しさん
10/05/01 01:29:47
int *cp = (int *)calloc(50, sizeof(int));
int *p[5][10];
for(int i = 0; i < 5; i++){
for(int j = 0; j < 10; j++){
p[i][j] = cp++;
}
}
*cpのデータは外部モジュールから受け取る2次元の情報で縦、横のサイズは決まっている。
ここではとりあえずcallocで代入。
2次元として加工したいのでポインタの二次元配列を宣言して「それぞれの要素にポインタを代入していく」。
「それぞれの要素にポインタを代入していく」操作が結構まどろっこしいように思えるのですが、もう少しスマートな方法はありますか?
598:デフォルトの名無しさん
10/05/01 01:44:25
>>588
まったく思いつかない。
どうやったんだ?
599:デフォルトの名無しさん
10/05/01 01:55:46
すみません、質問させてください
問題の箇所以外ははしょってますが
#define LINE_BUF 1024
main(){
int i;
int num;
char rf[LINE_BUF];
scanf("%d", &num);
fflush(stdin);
fgets(rf, LINE_BUF, stdin);
}
-------
残っている改行文字をfflushして、
次のfgetsにいきたいのですが、fgetsがそのまま飛んでしまいます
改行文字が入力ストリームに残っている、という状態なのかと思いますが
まずいと思われる箇所を指摘していただけると幸いです
600:デフォルトの名無しさん
10/05/01 01:59:41
>>599
コンパイラによっては使えることもあるけど
fflush(stdin);
は未定義動作
601:デフォルトの名無しさん
10/05/01 02:01:25
>>599
scanf("%d", &num);
fflush(stdin);
↓
fgets(rf, LINE_BUF, stdin);
sscanf(rf, "%d", &num);
602:デフォルトの名無しさん
10/05/01 02:03:13
なるほど、ありがとうございます
fflush関係のページをいろいろ見てみます
夜分遅くに、早いレス大変助かりました
603:デフォルトの名無しさん
10/05/01 02:04:14
調べてわからなければ聞くようにしろよ
604:デフォルトの名無しさん
10/05/01 02:06:58
>>601
これまた申し訳ございません
なるほど、こちらは一旦文字列をクッションに使う感じですね
こちらも後で試してみます
ありがとうございました
605:デフォルトの名無しさん
10/05/01 02:21:37
>>603
fflush(stdin)
を
setbuf(stdin, NULL)
と変更することでちゃんと動いてくれました
>>601
こちらの方法でも無事確認出来ました
お二人ともどうもありがとうございました
606:デフォルトの名無しさん
10/05/01 02:37:00
URLリンク(kansai2channeler.hp.infoseek.co.jp)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
上のテキストファイル(年別の平均気温などのデータ)の2列目のデータの小さいほうから順番に並べかえて、ファイルに出力するプログラムを作りたいのですがうまくいきません。
コンパイルは通るのですが、うまく作動しません
どこが違うんでしょうか?
なんかソートの部分がうまくいってない気がするのですが、よくわかりません
よろしくお願いします
607:デフォルトの名無しさん
10/05/01 03:48:20
nが2重に使われているのと
for( n=0 ; n < number ; n++ ){
for( j=n+1 ; n < number ; j++ ){
の2行目はj < numberかと
608:デフォルトの名無しさん
10/05/01 03:54:48
for( n=0 ; n < number ; n++ ){
// for( j=n+1 ; n < number ; j++ ){
for( j=n+1 ; j < number ; j++ ){
// for( n=0 ; n < number ; n++ ){
for( j=0 ; j < number ; j++ ){
609:607
10/05/01 04:01:49
ああ、見直してみたらnは2重になってなかったや。。
整形せずに見たらごらんの有様だよ
610:デフォルトの名無しさん
10/05/01 04:21:21
It's eight tabs.
611:側近中の側近 ◆0351148456
10/05/01 07:30:02
>>597
(っ´▽`)っ
for(int i = 0; i < 5; i++){
for(int j = 0; j < 10; j++){
p[i][j] = cp++;
}
}
の部分が、
memcpy(p, cp, sizeof(p));
でいけそうだが。どうだろう?
612:側近中の側近 ◆0351148456
10/05/01 07:35:27
(っ´▽`)っ
メモリ上の表現がpとcpで同じってところがポイントな。
どちらも、sizeof(int *)*50 バイト分、連続した領域が確保されている。
613:デフォルトの名無しさん
10/05/01 07:40:54
何を代入してるかわかってない
614:側近中の側近 ◆0351148456
10/05/01 07:42:16
(っ´▽`)っ
cpとcを同じ共用体で定義すれば、コピーが不要になる。
union U
{
int *cp;
int *c[5][10];
};
615:側近中の側近 ◆0351148456
10/05/01 07:46:23
>>613
(っ´▽`)っ cpは実体の配列、cは各々のポインタの配列だったか・・・。
しにたい
616:側近中の側近 ◆0351148456
10/05/01 07:55:51
>>614
(っ´▽`)っ ダブルポインターにしないとね☆
union U
{
int **cp;
int *c[5][10];
};
617:デフォルトの名無しさん
10/05/01 10:18:19
NG Name:側近中の側近 ◆0351148456
618:デフォルトの名無しさん
10/05/01 10:20:22
ID出ないからコテなのはありがたいねw
619:梓川水乃 ◆0351148456
10/05/01 12:57:35
>>618
(っ´▽`)っ そうだね☆
620:デフォルトの名無しさん
10/05/01 13:18:54
URLリンク(codepad.org)
URLリンク(codepad.org)
URLリンク(codepad.org)
単純過ぎるくらい単純にしないと当方バカなので3日後に読めないのです
621:606
10/05/01 15:07:07
指摘された部分を直したらファイルは出力されるようになったのですが、出力されたデータが
00000000000000000000000000000000000000みたいな感じになっちゃってます
622:デフォルトの名無しさん
10/05/01 15:20:23
ちゃんと>>608の指摘した2箇所を直したか?
後半のはfprintfのループのところだぞ?
623:597
10/05/01 15:28:27
>>616
それだと2重ポインタの方が0x00000000のままなので、
渡されるデータの位置アドレスと、配列の先頭アドレスとで共用してくれません。
私の例ではポインタの2次元配列にしていますが、2次元配列(ポインタではない)の先頭アドレス=渡されるデータの位置アドレス
となればそれが一番いいのですけど…
int hairetu[5][10];
int **p = hairetu;
これの逆バージョン…
int *p = (int *)0x********;
int a;
&a = p;
無茶ぶりですが配列無しでいえばこんな動作…やっぱり無理な気がしてきました。
624:606
10/05/01 15:39:59
>>622
一つだけnがjに変わってませんでした
確認不足でした
無事に出力することができました
ありがとうございます
625:デフォルトの名無しさん
10/05/01 15:50:06
>>623
やりたいことがいまいちわからない
こういうことかな?
union tag_hoge_t
{
int cp[50];
int c[5][10];
}hoge_t;
int *p=(int*)0x********;
hoge_t *q=(hoge_t*)p;
q->cp[10]==q->c[1][0];
============================================================
それともこうかな?
int *cp=(int*)0x********;
int (*c)[10]=(int*[10])cp;
c[1][1]==cp[11];
626:デフォルトの名無しさん
10/05/01 16:03:45
>>625
訂正
int (*c)[10]=(int(*)[10])cp;
627:597
10/05/01 16:20:26
>>625
ズバリそれです!!どちらでも理想の動作でした!
共用体のポインタもできるんですね。
後者は仕組みがよくわからないのでもう少し考えてみます。
後者の方がスマートで見た目がわかりやすいのでそちらを利用したいと思います。
以下に自分のやりたいことの完成形を載せておきます。
ありがとうございました!
union tag_hoge_t
{
int c[5][10];
};
int *p=(int*)0x********;
tag_hoge_t *q=(tag_hoge_t*)p;
if(q->c[1][0] == 10)…
============================================================
int *p=(int*)0x********;
int (*c)[5][10]=(int (*)[5][10])p;
if((*c)[1][0] == 10)…
628:597
10/05/01 16:25:34
>>627
後者はポインタの配列ではなく、配列のポインタになっているんですね
勉強になりました!
629:デフォルトの名無しさん
10/05/01 20:30:06
IMG 02691 JPG
URLリンク(www.seikei.or.jp)
私たちが当院の言語聴覚士です 宜しくお願いします
URLリンク(www.yushinkai.jp)
言語聴覚士を目指す高梨さん
URLリンク(www19.atpages.jp)
理学療法士 作業療法士 言語聴覚士
URLリンク(www.ims.gr.jp)
630:デフォルトの名無しさん
10/05/02 11:54:32
マクロ機能って標準Cに含まれるんですか?
631:デフォルトの名無しさん
10/05/02 12:22:15
当然
632:デフォルトの名無しさん
10/05/02 13:13:26
#include <stdio.h>
int main(void)
{
int a, b;
printf("キーボードから数値を入力してください");
printf("数値1を入力してください:"); scanf("%d", &a);
printf("数値2を入力してください:"); scanf("%d", &b);
printf("10割る3は、%d余り%dです。\n", a / b, a % b);
return (0);
}
8行目が違うっぽいんだけど、なんで?
633:デフォルトの名無しさん
10/05/02 13:14:39
全角スペース
634:デフォルトの名無しさん
10/05/02 13:15:19
printf("数値1を入力してください:"); scanf("%d", &a);
scanfの前が全角スペースになってる
635:デフォルトの名無しさん
10/05/02 13:16:13
>printf("10割る3は、%d余り%dです。\n", a / b, a % b);
printf("%d割る%dは、%d余り%dです。\n", a, b, a / b, a % b);
636:デフォルトの名無しさん
10/05/02 13:20:22
>>633-635
ありがとう!
637:デフォルトの名無しさん
10/05/02 14:23:17
文字型の変数を初期化する時に、本のサンプルコードには
char ch = '\0'
って書いてあるんだけど、この\0ってエスケープシーケンスの「\xxx:8進数でxxxの文字コードを持つ文字」って解釈で良いんですかね?
xxxだから数字が3文字(例えばnullを表す場合は\000のように)じゃなきゃいけないと思ってたんだけど、
上の例みたいに数字1文字で表せる場合は省略しちゃっても良いんですか?
638:デフォルトの名無しさん
10/05/02 14:51:10
君は最初から最後まで間違っている
639:637
10/05/02 14:52:17
え・・・・何が間違っているのか指摘して頂けると助かるのですが・・・・
640:デフォルトの名無しさん
10/05/02 15:04:43
'\000' で問題ないと思うけど、'\xxx'でも'\xx' '\x'でも。
641:637
10/05/02 15:06:31
ああなるほど理解できました。ありがとうございました。
xxxっていうのは要するに一般化された時の便宜で3文字表記になってただけなんですね。
642:デフォルトの名無しさん
10/05/02 15:07:38
なんで'\0'より先にエスケープシーケンスがどうこう言ってるんだろう
643:デフォルトの名無しさん
10/05/02 15:12:58
たぶんさ 彼はポインタをNULLにしたがてる所と間違ってるとも生んだけど
厳密には\0とNULLはちげーよって言うエライ方のお話はとりあえず置いておいて
644:637
10/05/02 15:15:50
>>642
このような表記のされ方で、既に読んだ部分に書いてある知識がエスケープシーケンスしかなかったのです・・・
本は結構親切な部類に入るんですけど、文字型変数を初期化する時の'\0'っていきなり出てきたので混乱してますorz
エスケープシーケンスじゃないんですか?
645:デフォルトの名無しさん
10/05/02 15:19:47
'\0'なんて機械的にそういうもんだと覚えるほうが多いと思うんだが。
646:デフォルトの名無しさん
10/05/02 17:58:39
>>644
\で始まる表記なので、エスケープシーケンスという解釈であってるよ。
647:デフォルトの名無しさん
10/05/02 20:13:31
>>646
だね
648:デフォルトの名無しさん
10/05/02 22:53:36
ダブルクォーテーションの出力ってどうすればいいのでしょう?
printf(""""); こんなことやっても出てこないので泣きそうです・・・
649:デフォルトの名無しさん
10/05/02 22:55:06
>>648
"\"\""
650:デフォルトの名無しさん
10/05/02 22:55:21
\"
651:デフォルトの名無しさん
10/05/02 22:57:00
>>649
ありがとうございます!!
652:デフォルトの名無しさん
10/05/02 23:49:47
646で思いっきりエスケーなんちゃらの話しがでてるのに
いきなりprintfでダブルコーテションどうやんの?とか釣りだろ
653:デフォルトの名無しさん
10/05/02 23:54:14
>>652
頭の悪い奴だよなw
654:デフォルトの名無しさん
10/05/03 00:05:58
おれも似たようなこと聞いて良い??
行が長いときの行末に置く¥あるじゃないですか
行末は良いんだけど、数行になると、そこ数行だけ行頭から始まるのが嫌なんだけど
あれをインデントしても良い方法ってないすか?先生方よろしくお願いします
655:デフォルトの名無しさん
10/05/03 00:07:31
文字列の話です
656:デフォルトの名無しさん
10/05/03 00:11:45
>>654
一旦ダブルクォートを閉じればいい
char foo[]="ABC"
"DEFG"
"H";
657:デフォルトの名無しさん
10/05/03 00:44:22
ほんとうだ、先生ありがとう
658:デフォルトの名無しさん
10/05/03 02:10:09
どういたしまして
659:デフォルトの名無しさん
10/05/03 16:19:16
C言語により記述された次の関数fがある。ここで、display()は
画面に1個の文字Aを書く手続きであるとする。
int f(int x){
display();
if(x==0)return 1;
if(x==1)return 3;
if(x==2)return 5;
return(f(x-1)+f(x-2)+f(x-3));
}
いま、f(x)を呼び出したとき、値105が返された。このf(x)が呼び出されてから
値を返すまでの間に、文字Aは画面にいくつ書かれたか。
1.43 2.44 3.45 4.46 5.47
すみませんが、このプログラムを文章に言い換えてもらえないでしょうか?
660:デフォルトの名無しさん
10/05/03 17:05:34
我輩はfである
661:デフォルトの名無しさん
10/05/03 17:10:58
>>659
下記の二式 f(x) および g(x) が与えられている
f(x)=f(x-1)+f(x-2)+f(x-3)
f(0)=1
f(1)=3
f(2)=5
g(x)=1+g(x-1)+g(x-2)+g(x-3)
g(0)=g(1)=g(2)=1
f(x)=105 であるとき g(x) はいくらになるか?
662:デフォルトの名無しさん
10/05/03 17:15:21
x>3の時、f(x)=f(x-1)+f(x-2)+f(x-3)
x<=3の時、
f(0)=1
f(1)=3
f(2)=5
だな
663:デフォルトの名無しさん
10/05/03 17:27:36
>>662
x≧3とx<3
664:デフォルトの名無しさん
10/05/03 18:08:57
宿題は宿題スレへ
665:デフォルトの名無しさん
10/05/03 19:51:51
「負の値が入力されるまで繰り返す」ってどうやるんだっけ?
666:デフォルトの名無しさん
10/05/03 19:54:47
入力値が0以上っていうのを継続条件にしましょう
667:デフォルトの名無しさん
10/05/03 19:55:47
なんで「どうやるんだっけ?」ってまるで以前は知ってたみたいな風に聞くの?
668:デフォルトの名無しさん
10/05/03 19:58:06
そういう設定なんです
669:デフォルトの名無しさん
10/05/03 19:58:32
痴呆症なんだろう
670:デフォルトの名無しさん
10/05/03 20:08:58
敵のスタンド攻撃で忘れちゃうんです
671:デフォルトの名無しさん
10/05/03 20:10:25
>>661>>662>>663
ありがとうございます
ところで
>g(x)=1+g(x-1)+g(x-2)+g(x-3)
>g(0)=g(1)=g(2)=1
はどこから出てきたんでしょうか?
672:デフォルトの名無しさん
10/05/03 20:13:12
f(x)一回につき文字を一個表示してるところからだろw
673:デフォルトの名無しさん
10/05/03 21:25:43
g(x) は表示回数を返す関数を定義してるだけ
x=0,1,2 の時は 1回書いて 抜ける: g(0)=g(1)=g(2)=1
それ以外では 1回書いた後、
674:デフォルトの名無しさん
10/05/03 21:26:58
途中送信してしまったが… (上略)
あとはわかるな
675:デフォルトの名無しさん
10/05/03 23:19:16
ポインタのサイズは4バイトの固定というのを見た事があるのですが、
64bitの場合でも同じですか?
676:デフォルトの名無しさん
10/05/03 23:21:17
別に固定じゃない
677:デフォルトの名無しさん
10/05/03 23:22:28
はい
678:デフォルトの名無しさん
10/05/03 23:51:34
見た事はすべて忘れろ
679:デフォルトの名無しさん
10/05/04 00:05:48
この環境のこのコンパイラは4バイト固定です、みたいな所読んだんだろ
それはそれで忘れちゃダメだろ
680:デフォルトの名無しさん
10/05/04 00:14:20
intが16ビットの環境だとポインタも2バイトだったの?
681:デフォルトの名無しさん
10/05/04 00:15:45
>>675
8バイトだよ
main() {
printf("%u", sizeof(void*));
}
682:デフォルトの名無しさん
10/05/04 00:25:49
データーバスのビット数とアドレスバスのビット数が違う環境があってな
int 型は、おおよそデータバスのビット数にあわすことが多いが
ポインタは、おおよそアドレスバスのビット数にあわすことが多い
アドレスレジスタが単純に並ばない 変態的な環境もあったのさ:
16ビットレジスタx2 を使って 24ビット物理アドレス を指す。
683:デフォルトの名無しさん
10/05/04 00:28:10
>>681
環境書かなきゃ全く意味無いよ
684:デフォルトの名無しさん
10/05/04 00:33:36
すぐ気付いたけどもういい
685:デフォルトの名無しさん
10/05/04 04:44:08
64ビット64ビットと偉そうに言ってるけどさ、
結局はいまだ1バイト8ビットじゃん。
そろそろ進化させないのか?
C言語の生まれたPDP-11でさえ10ビットあったのに。
俺に言わせりゃi7もPhenomも8ビットCPUだよ。
進歩してない。
686:675
10/05/04 08:15:31
>>681
thx
687:デフォルトの名無しさん
10/05/04 09:09:35
>>685
確かに1バイトは8ビットだけど、いまどきワード以外のデータを
使うなんて貧乏人だけだよ
C言語のcharとかshortとか互換性のためだけに残ってるけど
富豪は常にintですよ。0か1のフラグ変数にもint使いますよ
しかもILP64ですよ
688:デフォルトの名無しさん
10/05/04 10:11:45
×貧乏人だけ
○キャッシュ効率のことが頭にないバカだけ
689:デフォルトの名無しさん
10/05/04 11:11:28
命令増やしてキャッシュ潰してりゃ世話ないな
690:デフォルトの名無しさん
10/05/04 11:33:45
文字もintなのか
すげぇな
691:デフォルトの名無しさん
10/05/04 12:54:31
>>680
8086でMS-DOSの頃
16ビット(64KB)の範囲しか扱わないモードと1MBアクセスできるモードがあって
使い分けていた。今でもfarとかnearという残骸を見ることあるでしょ?
692:デフォルトの名無しさん
10/05/04 14:19:06
>>691
WIndows95の頃Morland-C++5.0を買ったんだが、えらくぶ厚い
マニュアルが数冊入っていて、今では考えられない位に8086のアーキテクチャ
を詳しく解説してあった
Windows3.1もまだまだ現役だった頃なので、STRICTを使ったプログラミング
も非常に克明に書いてあって、今読み返すと「ああこの頃はまだコンパイラ
メーカはやる気があったんだなあ」と思わせる
693:デフォルトの名無しさん
10/05/04 14:20:17
ああビール飲んでるからかtypoした
×Morland-C++
○Borland-C++
昼間から酒飲めるのは今日までか・・・orz
694:デフォルトの名無しさん
10/05/04 15:35:54
Cの文法的に下の書き方は正しいのでしょうか?
unsigned short Value;
Value = ((unsigned short)('AB'));
コンパイルされたアセンブリソースを見ると期待通りの結果になっているのですが、
移植等を考慮した場合、この書き方は避けるべきなのでしょうか?
movw ax,#04142H
分野は組込で、コンパイラはNECのものですが、エラーも警告もなしで通ります。
ググってみたものの、'A'については記述があるものの、期待する記述には出会えませんでした。
どうか、よろしくお願い申し上げます。
695:デフォルトの名無しさん
10/05/04 16:02:52
文法上は問題なし。 意味は処理系依存。
696:デフォルトの名無しさん
10/05/04 16:05:45
JIS X3010:2003 6.4.4.4 文字定数 より
2文字以上を含む(例えば 'ab')又は1バイトの実行文字で表現できない文字若しくは逆斜線表記を含む単純文字定数の値は, 処理系定義とする。
697:デフォルトの名無しさん
10/05/04 16:23:26
bccでやったら4241になったw
698:デフォルトの名無しさん
10/05/04 16:24:34
>>695-696
ありがとうございました。
時間があるときにJIS X3010:2003をよく読んでみます。
699:デフォルトの名無しさん
10/05/04 19:08:56
>>697
志村、エンディアン!エンディアン!
700:デフォルトの名無しさん
10/05/04 19:11:45
fgets関数について質問です。
この関数はEOFに達するとNULLを返すとのことですが、
FILE *fp;
char str[8];
while(fgets(str, 8, fp)){
printf("%s",str);
}
とやってファイルの内容を出力していった場合、最後はEOFが来てNULLが
返るので、最後のprintf1回が実行されないような気がするのですが、
そうではないようです・・・。それとも1文字ずつ判定してそのたびにprintfを
実行しているのでしょうか?
701:デフォルトの名無しさん
10/05/04 19:16:50
fgets内部の実装にもよるが、普通はバッファに一文字でも
書き込んだ状況でEOFが来てもフラグを設定するだけで
NULLは返さず次回の同じFILE*にたいする呼び出し時に
NULLを返す設計が取られるんじゃないかと...
(標準仕様でもそれが期待されているようだし)
702:デフォルトの名無しさん
10/05/04 19:21:52
>>700
ファイルの終端に達している状態でfgets()を呼ぶとEOFを返す
703:デフォルトの名無しさん
10/05/04 19:22:50
>>700
意味を勘違いしてる
最後の文字までとりこむfgetsではNULLを返さず
その次のfgetsでNULLを返すの
704:デフォルトの名無しさん
10/05/04 19:25:39
>>701 >>702 >>703
ありがとうございます!
なるほど理解できました。
705:デフォルトの名無しさん
10/05/04 22:42:34
質問です。
#include <stdio.h>
#include <string.h>
void main(void)
{
char name[5];
int len;
do{
printf("お名前を入力して下さい\t");
scanf("%s",name);
len = strlen(name);
} while(len>5);
printf("\nあなたのお名前は %s です。\n", name);
}
これでname[5]の配列に30文字くらい打ち込んで終了させると、
OSのほうから終了時にエラーが出されます。
メモリに打ち込んだ文字が残ってるからだと聞いたことがあるのですが、
これらの記録を消去して、エラーを出さないようにするにはどういうことをすればよいのでしょうか。
706:デフォルトの名無しさん
10/05/04 22:50:24
最初からname[200]くらいとっておく。
200以上入力しようとするやつは知らん
707:デフォルトの名無しさん
10/05/04 22:56:16
それか可変長だな・・・。
708:デフォルトの名無しさん
10/05/04 23:14:08
>>705
エラーがでるのはスタックに積んであるリターンアドレスをぶっこわしてるから
scanf("%4s",name);
とかやって、そもそも配列外にアクセスしないことが大事
709:デフォルトの名無しさん
10/05/06 12:16:27
>>706
その考えは身を滅ぼす。gets()を使うくらい、下策。
どうせscanf()を使っているのだから>708が妥当。
710:デフォルトの名無しさん
10/05/06 17:44:36
会社の研修の問題でもscanfは使わずにコーディングしなさい、だったぞ。
711:デフォルトの名無しさん
10/05/06 17:51:47
>>710
だからなんだってんだよ・・・・・・・・・・・・・
712:デフォルトの名無しさん
10/05/06 19:16:58
>>710
お前は何を言っているんだ
713:デフォルトの名無しさん
10/05/06 19:21:55
/ ( ●)(●) |
714:デフォルトの名無しさん
10/05/06 19:25:49
scanf は使わないのが常識だよ
715:デフォルトの名無しさん
10/05/06 19:28:23
printfも使わないのが常識
716:デフォルトの名無しさん
10/05/06 19:31:22
>>715
携帯開発部隊の方ですか?
717:デフォルトの名無しさん
10/05/06 19:31:35
scanf 使いたいときは sscanf を使うのが鉄則
718:705
10/05/06 21:19:16
バグ取れました。
次からはsscanfにすればいいのですね、ありがとうございました。
719:デフォルトの名無しさん
10/05/06 22:04:51
>>715
printfの戻り値を毎回確認してからしゃべれ、クソが
720:デフォルトの名無しさん
10/05/07 11:07:13
>>719
なにも考えずにつかっていたが、printfって戻り値があったのかw
721:デフォルトの名無しさん
10/05/07 11:48:44
そりゃ関数だし
722:デフォルトの名無しさん
10/05/07 11:51:02
voidだとおもってたわ。
723:デフォルトの名無しさん
10/05/08 00:42:00
質問します。
#include <stdio.h>
#include <stdlib.h>
char *input(void){
int i; char aaa[8]; int count =0; char *bb="";
printf("番号入力する");
scanf("%07s",aaa);
fflush(stdin);
while (aaa[count]){
count++;
}
for (i=0;i<count;i++){
*(bb+i)=aaa[i];
}
return(bb);
}
int main (void){
int i; char *p;
i=atoi(input()); printf("%d\n",i);
p=input(); printf("%s\n",p);
return(0);
}
これで実行してみると、printf("%s\n",p);で表示される文字の5桁目だけ、数字が入力時から+1された状態になります。
何故このようなことが起きるのでしょうか。
正しい表示にするにはどうすればよいのでしょうか?
724:デフォルトの名無しさん
10/05/08 01:17:34
わぁお、char *bb="";*(bb+i)=aaa[i];
とんでもないことしてくれてるな
725:デフォルトの名無しさん
10/05/08 01:20:10
スーパースマートコーディング
726:デフォルトの名無しさん
10/05/08 01:21:04
それ以前に変数名を何とかしろよw
727:デフォルトの名無しさん
10/05/08 01:44:32
>>723
何をしたいプログラムなのかわからないが、差し当たりの問題点を指摘する。
char *bb=""; は、コンパイラによっては書き込み不可領域に配置される場合があり、
実行時に落ちる気場合がある。
また、"" のみで初期化した場合、確保される領域は 2 バイトであるため、バッファ
オーバーフローを起こす可能性がある。
これらを防ぐには、malloc() でメモリ領域を動的に確保するか、main() 側でバッファ
を用意して input() に渡し、そこに入力結果を書き込むようにする。
なお、malloc() を使用する場合は必ず呼び出し側 (こごては main()) で戻り値を
記憶し、入力結果が不要になった時点で free() すべき。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4989日前に更新/245 KB
担当:undef