2 :
デフォルトの名無しさん :2009/11/19(木) 18:47:37
一見正しいように見えて間違っているもの 「関数に引導を渡すにはどうすればいいのですか」 デバッグは大抵こんなもんである。
参照渡しの続きをお願いします
Cでは値渡し使えない。さらにポインタが使えなければ関数に自分の 変数を変えてもらうような処理フローが使えない。ただそれだけ。
参 照 皇 大 神
ツェーゲング
事業仕分け、クリスマスを廃止「効果が国民に見えない」 政府の行政刷新会議(議長:鳩山首相)は13日、概算要求から無駄を洗い出す事業仕分けで「効果が国民に見えない」などとして 「クリスマス事業への予算配分を廃止する」ことを決定した。 東京・市ヶ谷の国立印刷局職員用体育館で開かれた会議の席上では、クリスマス事業を運営する独立行政法人クリスマス運営協会の担当者が 「子どもたちに夢と希望を与える重要なイベント」 「聖夜には信じられないような愛の奇跡が起きる」 と、鼻を赤くしながら熱弁をふるい総額1兆2千万円にのぼる予算の必要性を訴えた。 これに対し仕分け人側は 「子どもたちのためという美辞麗句の裏で、実際に使われている経費は大人のホテル代だのいやらしい目的のものが大半を占めるのはなぜか」 「年々イベントのはじまる時期が早くなっている。今年は10月末からムカつく宣伝を見かけるようになった」 「効果が国民に見えない。少なくとも私は去年一人クリスマスだった」 と厳しく指摘。予算の全面廃止を決めた。 これに伴い2009年のクリスマスは中止になる見込み。経済に少し詳しい評論家の池田信夫氏は 「童貞でも“もしかして…”という淡い期待とともにコンドームを買い込んでドキドキ過ごせるのがクリスマスの醍醐味。一方的にムダと断じて廃止する事業仕分けは人民裁判だ」 と批判する。とはいえ、今年末は心穏やかに過ごすことができそうだ。
一見ふさけているように見えて正しいもの while(--i)
マナの「やさしくC」っていい?
>>11 悪くはないと思うが、ANSI C の方がいい
typedef int (*sqlite3_callback16)(void*,int,__wchar_t**, __wchar_t**); このようなコードを見ました。 関数ポインタ宣言にtypedefをくっつけてるのはどういった意味があるのでしょうか? この関数ポインタ型は、ある関数にコールバック用引数として渡されていました。 その際の表記は sqlite3_callback16 xCallbackです。
関数ポインタでもそうでなくても一緒 その型に別名を付ける typedef int foo; とすれば、foo は int の別名になる typedef int *bar; とすれば、bar は int* の別名になる typedef int (*sqlite3_callback16)(void*,int,__wchar_t**, __wchar_t**); とすれば、 sqlite3_callback16 は int(*)(void*,int,__wchar_t**,__wchar_t**) の別名になる
>>4 ポインタを使えなくてもプログラムは十分書けるだろ
関数ポインタ分からないと、割り込み処理できねえぞ 素人は割り込みのイベントコードを見て||||||||||||||||||||||||||||||||||||||| いったいどれくらい一行を長くするのか、ってくらい繋げるが こんなの関数ポインタ使えばビットシフトするだけで済む。
手前等ビットシフトを嫌ってないか。ナメてないか。 ふざけるな タマ落としたか ビットシフトとアセンブラはプログラマに必須である。 短いコード、速いコードを書くのがプログラマ それを求めないやつは全部アプリコーダーである
>15 ありがとうございます。 typedefの役割については存じていましたが、>14の表記ですと、 intの別名が(*sqlite3_callback16)(void*,int,__wchar_t**, __wchar_t**) になるのではないかと 考えていました。
>21ですが、 ググってみるとそれらしき解説が出てきました。重ねてありがとうございました。
%d ってどう読むんですか‥
だんねんながら、それはパーネントディーとよみまねん。
dllで本体のメモリのdeleteは出来ないんですか。 バグかと思って修正してもいくらやってもむりそうなんですが。
ポインタが指しているアドレスは、関数に渡す前も、DLLでも同一なんです。 でもdeleteしたとたんに終了します
>>20 そのとおり。
ビットシフトとアセンブラ使えば、フィボナッチ数列の1000番目だってあっという間。
deleteって、絶対C++だろ。
>>25 一般的には無理。
割と簡単なのがnewすると同時にshared_ptrに入れて、それをやりとりすること。
shared_ptrがうまいことやってくれる。
共に同じコンパイラの同じバージョンなら、
双方で共通して使えるHeapAllocなどを使ってoperator new、operator deleteを定義するという手も可能だろうが面倒。
Cの課題が解けなくて困ってます ほとんど初心者なので知識がさっぱりです 助けてください 問題 入力した5個の名前を整列して表示する やり方は名前を配列に格納した後 各配列の先頭アドレスに対するポインタ配列の要素を入れ替える整列方法 [使用ポインタ配列] char *pt_name[5]
すみません、さっきの続きです ここまではできているのですが 動かなくて困っています #include <stdio.h> int main(void) { char *pt_name[5],name[5][256]; int i,j,w; printf("名前を2つ入力してください"); for(i=0;i<5;i++) scanf("%s",name[i]); pt_name[i] = name[i]; printf("整列結果\n"); for(i=0;i<5;i++){ for(j=0;j==NULL;j++){ if(name[i][j]<name[i][j+1]) w = *pt_name[i]; *pt_name[i] = *pt_name[i+1]; *pt_name[i+1] = w; } } } return(0);
&・・・?
いろいろひどすぎてどっから突っ込めばいいかわからない
ひどすぎるのは分かっています それを承知でお願いしています お願いします ちょっと手直ししたヤツです #include <stdio.h> int main(void) { char *pt_name[5],name[5][256]; int i,j,w; printf("名前を2つ入力してください"); for(i=0;i<5;i++) scanf("%s",name[i]); pt_name[i] = name[i]; printf("整列結果\n"); for(i=0;i<5;i++){ for(j=0;j==NULL;j++){ if(name[i][j]<name[i][j+1]) w = *pt_name[i]; *pt_name[i] = *pt_name[i+1]; *pt_name[i+1] = w; } } for(i=0;i<5;i++) printf("%s\n",*pt_name[i]); return(0); }
printf("名前を5つ入力してください"); for(i=0;i<5;i++) { scanf("%s",name[i]); pt_name[i] = name[i]; }
教えてください。 以下のワーニングをとりたいんですが、どうしてもとることが出来ません。 関数の宣言の引数の型と呼び出す際の型はあっています。 (unsigned short型です) どのような原因が考えられますでしょうか? よろしくおねがいします。 warning: passing arg 1 of `関数名' with different width due to prototype
38 :
デフォルトの名無しさん :2009/11/19(木) 23:33:00
ワーニング(笑)
>関数の宣言の引数の型と呼び出す際の型はあっています。 あってないよって言ってるみたいだけど
>>36 C:\LSIC86\de-da>TEST
u?aOe≡eQe┬o?u?e?e─e!e?e│eomikan ringo suika remon banana
E≪u±iie?
%s
%s
%s
%s
%s
NULL pointer assignment
-- Press any key to exit (Input "c" to continue) --
もうだめです
意味が分からなくなってきました
>>40 5つ名前を入力して、それを順番に並べるだけでいいんだな?
ポインタ配列を使って?
こういうこと? #include <stdio.h> int main(void) { char name[5][30], *pt_name[5]; int i=0; printf("名前を入力\n"); for(i=0;i<5;i++) { pt_name[i]=&name[i][NULL]; scanf(" %s", pt_name[i]); } puts("名前を表示"); for(i=0;i<5;i++) { printf("%s\n", pt_name[i]); } return 0; }
間違えた
# include <stdio.h> int main (vpod){ char buf[256]; char name[5][256]; char w; int i,j; for (i = 0; i < 5 ; i++){ printf("5回入力\n"); fgets(buf, sizeof(buf),stdin); sscanf(buf, "%s", name[i]); } for(i=0;i<5;i++){ for(j=0;j=='\n';j++){ if(*name[i] < *name[j]) w = *name[i]; *name[i] = *name[j]; *name[j] = w; } } for(i=0;i<5;i++){ printf("%s\n",name[i]); } return(0); } ほらよ
48 :
デフォルトの名無しさん :2009/11/20(金) 00:15:46
ニュートン法を用いて、 f(x)=ln(x)-0.25*x=0 の2つの解を求めるプログラムを作成せよ。 こんな問題が出たのですが、何回やってもできません!! どなたか教えてください
int main (void) な・・ インデントや修正するんだぞ。。
50 :
デフォルトの名無しさん :2009/11/20(金) 00:19:59
警告: int 型変数 vpod は一度も使われない
>>47 ありがとうございます!!
これからは自分でできるようがんばってみます!!
>>47 ソートが出来てなかった
strcomp使うの忘れてた
補完しといてくれ・・
54 :
デフォルトの名無しさん :2009/11/20(金) 00:24:25
48です #include<stdio.h> #include<math.h> int main(void){ double x,y; double h=0.1; double f(double x); {return log(x)-0.25*x;} for(x=0.5;x<15;x+=h){ printf("x=%9f,y=%10f\n",x,y=f(x)); if(y>0)h=1.0; } return 0; } こんな感じでやったんですけど出来ませんでした!!
2次元配列を利用して、 2進数を入力しそれから10進数、16進数にしろって課題が出されたんですが わかりません わかりますか?
わかりますよ。
二次元配列を利用する理由がわからん。
X軸に桁、Y軸に0または1とお考えください。
なん……だと……?
>54 いろいろ突っ込む所があるが まずニュートン法を理解していない
63 :
デフォルトの名無しさん :2009/11/20(金) 04:47:37
C言語
malloc(0); の動作は保証されますか?
処理系依存
NULLを返すか0以外を指定したときと同じ動作のいずれかが 処理系で定義されてることが保証されてる
>>64 戻り値はfreeするかreallocするしかないけどそれらの引数に使えるのは間違いない
malloc(0)がNULLを返さなければの話
多くの環境ではfree(NULL)は問題ないが、Windows系の場合は それだけでオチる
fclose(NULL) と混在してないか?
free関数は,ptrが指す領域を解放し,その後の割付けに使用できるようにする。 ptrが空ポインタの場合,何もしない。
何もしなくても落ちるしね
>>73 いつの話してんだお前は。
古いシステム持ち出すなら、HP-UX だって落ちてたわい。
>>73 うそをいうな。 MS-C 5.10 の頃にはすでに free(0) は no operation になっている。
ヌルポをフリーしたら落ちるってのは常識だろ
NULLにしとけば落ちないっていうのが、標準動作だが。 メモリ操作するときのポインタはNULLクリアしとけっていった。
C++ delete NULL; //OK C free(NULL); //基本的にはOKな方向なんだが、 古いライブラリではそうとも限らないので、こういうつまらんことが原因で古いライブラリな処理系で動作しないことがないように freeする前にNULLかどうかチェックしてから行ってあげて
ANSI及びISOではfree(NULL)は何もしない。JISでは落ちるのかもね。
81 :
デフォルトの名無しさん :2009/11/20(金) 19:33:27
そもそも free(ptr); の時点で ptr == NULL なのがプログラムの設計として まずい兆候なんだが 規格でどーこー言う前に
そういうこともある。一度目に訪れたときは、メモリ確保してないときなどがある。 確保したのかしてないのか不明の場合もあり得る。
>ptr == NULL なのがプログラムの設計としてまずい兆候なんだが だれからそんな妄想を習ったのだ。 そもそもCのfreeやC++のdeleteがなぜぬるぽの時何もしない仕様になったかといえば ぬるぽの時にわざわざ分岐を書かなくてすむという現場の要請があったからなのだ。
84 :
デフォルトの名無しさん :2009/11/20(金) 19:47:21
分岐の必要性が出る背景をまずい兆候と言ったんだが それが絶対ダメとか聞こえる耳なら他からも変な妄想をいっぱい貰ってそうな「まずい兆候」だな
>分岐の必要性が出る背景をまずい兆候 だれからそんな妄想を(以下略)。 Effective C++でさえ、普通に delete 0 やってるぞ?ん? それともお前の読んでいる本では「まずい兆候」なのか?
とりあえず
>>83 は「まずい兆候」って書いてある教科書をさらすべきだろう
そうすればみんな納得^^
88 :
デフォルトの名無しさん :2009/11/20(金) 20:01:12
おまえらよー 誰かから習ったり、本から読んだって前提はどこから出てきた? この時点でものすごく「まずい兆候」をおまえらに感じるぞ
いやいや、自分は後学のために >そもそも free(ptr); の時点で >ptr == NULL なのがプログラムの設計として >まずい兆候なんだが となる具体的な事例を知りたいだけですよ^^ 別にあなたの意見を否定はしていませんです むしろよろしくお願いしますと頭を下げる勢いm^^m
2重free?になるような状況を言ってるんじゃ
91 :
デフォルトの名無しさん :2009/11/20(金) 20:09:37
具体的な事例を1つも知らん者に ここで具体例を示すことに価値を感じない 頭が悪すぎるのか、そんな段階ではないのか、いずれにしてもね
あらら…「入門編」のスレでそれですか。^^; もしかして、知らないだけでしょ? ^m^クスクス
このあと必死の弁解↓
入門編のスレにきて お前ら頭が悪すぎる、そんなものに教える価値は感じない 何しにきてるんだろう?
95 :
デフォルトの名無しさん :2009/11/20(金) 20:28:17
何か書いたとして、それを絶対ダメと読まれかねない状況が「入門編」のスレで起きているわけだが
俺は正しい、間違ってるのはお前ら。 証拠はないけどこれは事実。 こういう考えなんだろ
「絶対ダメと読まれかねない状況」とかどんな妄想? 誰もそんなこと書いてないのに。
とんち勝負はもういいよ
ダブルポインタはアドレスのアドレスでいいの?
アドレスのアドレスは変。 アドレスを指し示す変数のアドレスだろ。
int型は整数は変。 整数を入れておくための変数だろ みたいな言い方だな
内容と入れ物は分けよう
char **pは、アドレスを指し示す変数のアドレスを指し示す変数だな。 pの内容は、アドレスを指し示す変数のアドレスだな。
こまかいやつらだなーwww こういうのが回りにいたらうざすぎるwwwwwww
>>104 wwwwwwwwwww
職場にいたらうざすぎるwwwwwwwwwww
プログラム書くのに細かくない奴はダメだろ・・・
途中に変数が入ることが大事だろ。 アドレスのアドレス、はあり得ない。 → アドレスの入ってる変数のアドレス、はあり得る。
日常でも たとえば 〜〜それ以上でも以下でもない とかいう決まり文句に対して 以上でも以下でもないなんてことはありえない! とかいちいちいってそう。キモッ
109 :
デフォルトの名無しさん :2009/11/20(金) 22:57:23
「現場の要請」の現場がどこなのか知っていて、 「まずい兆候」を妄想と言い切った おまけに教員か本しか情報源が思い当たらない 決定打で他の人がヒントっぽいことを書いてくれているのが通じていない どこの現場のためか知らんが、こーゆーバカの矯正をぶっ叩けないところからボランティアでやれって? お断りだ、何を言っても変に妄想されるだけで草臥れ儲けだからな # スレ違いだが delete に new が返したものではない値(しかも整数)を平気で書ける神経が全く理解しがたい # それこそどこの本に書いてあったのか、誰に習ったのか、謎なんだが
110 :
デフォルトの名無しさん :2009/11/20(金) 22:57:46
宇宙って膨張しているんでしょ? じゃあどうして僕たちは膨張しないの? 教えてせんせー
宇宙じゃないから
112 :
デフォルトの名無しさん :2009/11/20(金) 23:00:47
>>111 この空間、僕たち全ては宇宙にある物質だよね?
ちがうの?
宇宙は膨張してる 俺らも膨張してる ただ俺らの体は宇宙に比べてものすごい小さいから感じないだけ。 あと何十億年もたったら物質は膨張しすぎてバラバラになるよ
114 :
デフォルトの名無しさん :2009/11/20(金) 23:03:01
>>113 そうなんだー!
でも数十億年先は、僕は生きていないからどうでもいいや。
ありがとう。
C言語はいちいちコンパイラとか手に入れなきゃならんの? Windowsに標準で入ってないの?
codepadってサイトにいってごらん コンパイラいらずだよ まったくいい世の中になったもんだ
おーありがとう ちょっとしたことやりたいだけなのに フォルダの中が.hだか.cだかくだらんテキストファイルとexeで埋め尽くされなくてもテストできて便利だの
はじめから使える言語 wsh jscript
学校の課題とかで電卓機能程度にしか使わないんじゃね
codepadなんて、ちょっと出力増えるだけで使えなくなるだろw
>>109 で、なんでそんな上から目線で回答しないやつが入門編スレにいるの?
バカなの?死ぬの?
知識のない初心者をあざ笑うくらいしか人生にやることがないんだろう それもわざわざageてまで
このスレにいる連中 初心者質問者なのにやたら偉そうなやつ やたら細かくてどうでもいいことまで指摘しないと気がすまないやつ 入門スレだから初心者が多いと思われる他人をバカにして楽しむやつ ただ質問に答えまくるロボットくん 宇宙の話とかプログラミングやC言語とはほとんど関係ない話をしたがるやつ 123みたいなメタバカ
126 :
デフォルトの名無しさん :2009/11/21(土) 00:20:12
OSの作り方教えてください
printf("OS");
そういう本が出版されてるからそれ読め
Onanii Saikou
C言語は構造つかうときに いちいちstructって書かないとダメで冗長でめんどくさいな。 C++のほうが良いな。
つ typedef
>131 つtypedef
mallocで確保したメモリ領域って freeで開放しなかったらどうなんの? アプリケーションが終了してもそのメモリ領域は使用不能になるの?
処理系依存
>アプリケーションが終了してもそのメモリ領域は使用不能 へぼOSではあり得るかもしれんが、実物は知らない。
137 :
デフォルトの名無しさん :2009/11/21(土) 01:21:16
NULL ポインタfreeが古い処理系じゃまずかった理由? 一部の古い処理系ではNULLは定数ではなくmalloc書き込み専用変数 だった。(一般は参照のみ可) 古い話なんで細かいことは省略するが、プログラムのモジュール通信 の為だけに特権的な値を設定することなど貴重なアドレス空間の無駄 遣いでタブーという時代の要請としておく freeはNULLを参照しないで機械的にブロック解放を行うので 間違った値を与えると確実にヒープを壊しプログラムは早晩落ちた。
ごめん、 > malloc書き込み専用変数 すらわけわからん。
>>138 昔のシステムはヒープが空になったタイミングで拡張/縮小の
為に移動しなければならなかったりとかいろいろと複雑な
ものがあったね。こういった場合はNULL値の定義は難しい。
三次元配列=ウンコ
CではNULLは完全な市民権を得ているというわけではないみたいw ハードウェアに近い低レベル処理を記述する場合はいろいろと注意が 必要なのかも けど新しめな環境やOS上のプログラミングでは多分完全OK C++では予約語では無いみたいだが、主導権すら得ているし 完全にスレ違いではあるがJavaではnull無しではプログラムに ならないくらいの重要な予約語だし こういう理解でいいのかな?
nullポインタ定数、nullポインタ値、NULLマクロは全部別物。 多分とかかもとか言ってないで、規格票よみゃいいだけ。
144 :
デフォルトの名無しさん :2009/11/21(土) 10:37:00
NULL は C でも予約語ではないし、 nullポインタなんて用語は規格票を読んでも登場しない 低レベル処理では 0 番地に何かあり、そこを指し示すポインタを有効なポインタとして使う場合がある しかし、そこでも NULL は 0 だ メモリコンパクションは、それが起きる機会と、その機会を経たポインタを更新する方法が明確化されているが そのような環境でも NULL は 0 で十分に機能していた 空ポインタのビット列が 0 でない処理系は実在したらしいが、俺はその時代を生きていないので 昨晩のバカのように本から読んだことしか語れない # C++ ではどっこい現役だけどね
Intelプロセッサのi386系列の場合アドレスはセレクタに 書かれてるベースアドレスからの相対アドレスだから その上のC言語においてNULLをmallocの無効アドレス 戻り値として解釈定義する限り0は不合理とまでは 言わないが、大抵の場合例えば-1(0xFFFFFFFF)とか 負の整数で定義するほうが、CPUのせっかくの保護 機能を生かせることになる。
プ
CPUの例外とかではなくて 言語としてNULLはリターンするとかの決まりだろ。
>145 何いってんだか null constantは0または(void *)0だよ
構造体の配列をループさせたいのですが、どうやるのが適当でしょうか。 struct st { const char *name; int age; }; struct st list[] = { {"Lucy", 13}, {"Tom", 17}, {0, 0} }; このように、リストの最後に番兵な構造体{0, 0}を置いて struct st *st = list; for (;;) { if (st->name && st->age) { // 処理 } else break; list++; } こんな感じで動いているのですが、他にいい方法はありますか? 一応 sizeof(list)/sizeof(struct st)で配列の要素数を求めることも出来ますが 納得できません。 よろしくお願いします。
すみません(汗 list++ ではなく st++ の間違えです。 脳内変換お願いします。
安全やるなら、STL vectorに入れとけよ
>>151 すみません、誤爆しました。
C言語のスレだと思っていました。移動します。
すみません、C言語の質問スレってどこにあるのですか?
あれ? ここC言語の質問すれだ(笑) ところで STL Vector って何ですかね。 検索しても C++ しか出てこない(C++は未経験) Cにも STL Vector ってあるのでしょうか。
つ cstl-0.6.2.zip
自分で作れよ自己参照構造体使えばできるだろそれがC使いの生き方
>>156 自己参照構造体とは何ぞや?
と思って調べたら連結リストで使うものですか。
実は、自分の書いたコードではなく、オープンソースプログラムを改編しているのです。
配列でデータ構造が表現されているので、それに従うしかありません。
ちなみに、僕は、あまりC使いな人ではありません。
で、ライブラリ関数とか見てみると、番兵法使っているものも結構あるのでこのままでいこうと思います。
ありがとうございました。
struct P{ P *p; } ってやつか
構造体じゃない配列はどうやってんだよ? 同じようにやれば良いだろ。
スタックコールについて聞きたいんですが ボードゲームのAIについて勉強していて、ゲーム木とα-β法というアルゴリズムを利用しているのですが ソースコード内に特にランダムな値を利用しているわけではないのにプログラム同士の対戦結果が毎回違うのに悩んでいました。 勝手な予想ですが、おそらくゲーム木を再帰的に探索する途中に探索する順序が違うとα-β法によりゲーム木のサブツリーのカットの仕方が違うため違う結果がでるのではないかと考えました。 そこで、探索する順序を一定にするためにスタックコールで呼び出す関数の順序を設定したいのですが、C言語でそのような操作はできるのでしょうか?
>>160 ツリーをたどるときに、どの枝をたどっているかを出力させればいいだけじゃね?
カットする時にも、どの枝をカットしたかを(評価関数の出力も含めて)出せばいい。
ちなみに、シングルスレッドで組んでいるのなら毎回結果が違うのはバグであるとしか思えない。
初期化されていない変数使ったとか、バッファオーバーランしたとかの。
探索する順序を一定にするには、スタックコールなど使わなくてもプログラム側で決まった順に探索するようにすればいい。 (そもそもランダムな順序で探索するようにはしてないと思うけど)
レスありがとうございます。 シングルスレッドなのですがフリーのチェスプログラムなので恐らくバグではないと思います。 ランダム以外で違う出力になる要因て他に何かあるのでしょうか? 情報が少ないので答え難いとおもいますが こちらから出してほしい情報がありましたらなんでも聞いてください
最適手の検索を時間で打ち切ってるとか。 それなら負荷状態によっても結果が変わる。
フリーのチェスプログラムのソースがあれば、誰か解析してくれるんじゃね?
自分もそう思って探索深度を低くして探索時間を長時間にしてタイムオーバーでの探索打ち切りが行われないようにしたつもりですが、他にも打ち切りの条件があるのかもしれないので、もう少し調べてみます。
GNU-Chess 5.07なんですが結構ソースコードが長くて わかりやすくコーディングされてはいるんですが、労力をかけてしまうので、そこまでは結構です^^;
169 :
デフォルトの名無しさん :2009/11/21(土) 18:55:17
VisualC++ 2008ですが struct a { char b[0]; }; の時sizeof(struct a)が4になるのは正しい言語仕様なのでしょうか? gcc 4.2.1では期待通り0になりました。
キリのいいサイズのほうが扱いやすいので勝手に構造体に詰め物をしてもいい このへんは環境依存
環境依存な言語つくるなよksg
てことは、効率を犠牲にして実装までガチガチに定めてしまうん?
いやならほかの言語使えよksg
175 :
デフォルトの名無しさん :2009/11/21(土) 20:12:29
醜い
独学でc言語の勉強を始めて1,2週間しかたってませんがおそらくとても基本的なところだとおもうのですがつまずいてしまったのでもしよろしかったらご教授ください。 #include<stdio.h> int count_bits(unsigned x) /*1.もしかしてここにも下で入力したnxがくるんですか?*/ { int count=0; while (x){ if(x&1U) count++; x>>=1; } /*2.ここのwhile分の終了条件は非xだと思うのですがこれはどのように終了してるのでしょうか?*/ return(count); /*3.ここでunsigned型が32ビットなので1が32桁で32が返されるのでしょうか?*/ } int int_bits(void) { return(count_bits(~0U)); } void print_bits(unsigned x) /*4.←ここに下で入力したnxがきますよね?*/ { int i; for(i=int_bits()-1;i>=0;i--) putchar(((x>>i)&1U)?'1':'0'); } int main(void) { unsigned nx; printf("非負の整数を入力してください"); scanf("%d",&nx); print_bits(nx); putchar('\n'); return(0); } ラインの関係上見づらくて本当にすみませんしかも質問の意味も糞みたいにわかりづらいですね当方も聞きたいことすらよくわからなくなっている状態ですorzなんとか読み取ってくださると幸いです。
インデントのないソースは見ないことになっている
1.nxは来ない。~0Uが来る。 2.継続条件はxが非ゼロ。逆に言えばxがゼロにるのが終了条件。 3.xに入ってる数を2進法で表したときの1の数をが返される。0から32のいずれかの数。 4.うん。
181 :
デフォルトの名無しさん :2009/11/22(日) 05:29:24
コンソール画面の文字全部消すことってできないの?
できる
>>181 きっとできる。液晶ディスプレイめがけて
適当な重いものを思いっきり投げつけるんだ
バットでも、バイルでもいい
>>181 業界標準の方法
printf("%c[2J",0x1b)
これでうまくいかなかったら
マニュアルなり資料なり参照しなければムリ
もしかして出来ない場合もあるかも
185 :
178 :2009/11/22(日) 09:42:40
>>180 本当にありがとうございます。3番がよくわからないのですが
>>xに入ってる数を2進数で表したとき
このときxにはなにがはいってるのでしょうか?末尾にUをつけたときには2進数になるとは書いていないんですがどこで二進数で表すようになるのでしょうか?
#include<stdio.h>
int count_bits(unsigned x)
{
int count=0;
while (x){
if(x&1U) count++;
x>>=1;
}
return(count); /*下の1111111111....の1の数がそのままここにくると思ったのですが・・・
}
int int_bits(void)
{
return(count_bits(~0U)); /*ここは0を反転させたものなので1111111111...となるのではないでしょうか?*/
}
void print_bits(unsigned x)
{
int i;
for(i=int_bits()-1;i>=0;i--)
putchar(((x>>i)&1U)?'1':'0');
}
理解力がなく大変申し訳ない。すみませんがもう少しおつきあいください。
int_bitsまわりは、unsignedのビット数を割り出してるだけだよ 環境によっては,unsignedが16bitとかの時もあるし
187 :
デフォルトの名無しさん :2009/11/22(日) 12:17:49
188 :
デフォルトの名無しさん :2009/11/22(日) 12:19:25
C++のクラスを作り始めて3ヶ月です。 Stringクラスを作っています。 関数や演算子は色々と省いてありますが、 このコードについて批評をお願いします。
190 :
189 :2009/11/22(日) 12:30:09
class String { boost::shared_array<wchar_t> _base; public: String() { wchar_t *bs = new wchar_t[1]; bs[0] = L'\0'; _base = boost::shared_array<wchar_t>(bs); } String(const wchar_t *wArray) { int len = wcslen(wArray) + 1; wchar_t *bs = new wchar_t[len]; wmemcpy_s(bs, len, wArray, len); _base = boost::shared_array<wchar_t>(bs); } String(String &cpy){ this->_base = cpy._base; } ~String(){} public: int Count() { return wcslen(_base.get()); } wchar_t* GetData() { return _base.get(); } String Substring(int index, int length) { wchar_t* copyTo = new wchar_t[length + 1]; wmemcpy_s(copyTo, length, _base.get() + index, length); copyTo[length] = L'\0'; return String(copyTo); } };
191 :
189 :2009/11/22(日) 12:31:15
int main()
{
setlocale(LC_ALL, "");
String s = L"Stringクラスです。";
wprintf(L"%s, count = %d, sizeof = %d\n", s.GetData(), s.Count(), sizeof(s));
String substr = s.Substring(6, 3);
wprintf(L"Substring: %s, count = %d\n", substr.GetData(), substr.Count());
getchar();
return 0;
}
http://codepad.org/y60w7ej7 コンセプトとしては、
Substringなどの文字列操作の関数は中のwchar配列を変更せず、
新しく文字列を作って返すという感じで。
なるべくshared_ptrをmain関数の中とかで使いたくないので、
今はStringインスタンスを値型で返しているのですが・・・
オーバーヘッドとかはどうなんでしょうか。
設計的問題、凡ミス、ハァ?なこと、
どんなことでもいいので指導してください。お願いします。
>>181 #<stdlib.h>
system("cls");
か
#<conio.h>
clrscr();
かな。
193 :
189 :2009/11/22(日) 12:41:00
ちなみにVC++2008です
>>191 クラス名は WString とかにしたほうがいいんじゃない?
wchar用のstringクラスを作りたかったんだよね
SubString()は、引数のエラーチェックをしたほうがいい
マイナスとかMAXINTは指定されたくないでしょう
,.―― 、 // \\ . / ./ \\ / ′ ,. -―――- 、 \ % %ェ %%%%%■%%〓%%ャ %ェ … . \ :! /: :/l ∧: : :∧: ヘ\/ .%%■% %ェ %¨ ∵% %ェ ・ . \|/: :W 廴__,\/、__ノ:Y %% %%%% ¨%%%%%%%■■〓%%%% / |:r|: | r=ミ r=ミl:| %%%%%%%%%■〓%% %% ∴ %ェ . . _/: : :{.|: | xxx ' xxx リ %%%%%%%%%%% %ェ ∴ ….% %% .. __,/: :_:./:/:ハ:ゝ )%%%%%%%%%%%%%%% %ェ %%%%% .. |: : : : :/__ /:/:/: \`ヘー一ァ::i"|Y:\ ¨ %%%■%%% %ェ ∴‥
Linuxのインストール中のコンソールの画面で表示される文字が流れずにキャレットは左下の位置に固定されてて 最下行の文字列だけ書き換わるような表示ってどうやったらできるんですか。 >■インストール中 ===-> [69%] みたいな。
>196 Linuxならcursesでググってみて。 環境依存OKスレがオーバーフローしているけど、誰かnewしないかな。
環境依存OKスレのオーバーフローでC言語入門スレが破壊されますた
199 :
189 :2009/11/22(日) 13:22:33
>>194 ありがとうございます。
あと、Substringの戻り値なんですが、あのまま戻しても問題ないですよね?
>>196 たいていの場合、^H(0x08)で1文字戻すか、
^M(0x0d)で行頭に戻しているだけ
cursesとかtermcapとかは、正しく端末設定されて、かつ
設定ファイルが揃ってないと使えないので、OS起動時とかは
決め打ちでやることが多い
>>196 @echo off
setlocal
set /a i = 0
:loop
set str=%str%*
set /a i += 5
cls
echo インストール中...[%i% %%] %str%
timeout /t 1 /nobreak > nul
if "%i%" == "100" goto endloop
goto loop
:endloop
echo 完了
pause
endlocal
バッチファイル現るw linuxって言ってんのに
UNICODEがC言語でも処理できるという情報を小耳に挟んで 朝から昼飯や夕飯も惜しんで葛藤してるものなんですが wchar.hのfopen_s関数の使い方がよく判りません。 特に、fopen_s関数の第一引数がなんで二次ポインターなのか 教えて頂きたいです。そして、複数のUNICODEにエンコードされた ナンバーのついたファイルを効率よくバファリングするのに 二次ポインターを使った方が後々不備が出ない設計になると思い 四苦八苦してるところです。つまり、fopen_s関数の第一引数のアクセス権も 把握しかつ自分の論理的思考によりポインターを細分化していくような労力が必要になります。 void openstream(int min,int max,char *p1){ FILE *file[MAXSIZE]; int i; char copy[30]; char str[30]; char p2[150]; errno_t err;copy[0]='\0';str[0]='\0';p2[0]='\0'; for(i=0;i<(max-min)+1;i++){ strcpy(p2,p1); sprintf(str,"%d",(i+min)); strcpy(copy,"\\単語"); strcat(copy,str); strcat(copy,".txt"); strcat(p2,copy); if( (err= fopen_s(&fp3[i],p2, "rb,ccs=UNICODE" ))!=0) exit(1); } } }
上記のソースは絶対パスと規則的なナンバーがついた UNICODEの単語x.txtファイルを順に開いていくプログラムですが fp3のポインターによりそれぞれの定型処理で、ストリームを 開いていってもFILE型で宣言が無意味なぐらい 爆発的に伸びる階数のように不規則な動きをします。
駄文で申しわけありませんが ご指南の方をよろしくお願いします
>>205 質問の内容についてはよく分かんないけど
こうしたほうが良くね?
strcpy(p2,p1);
sprintf(str,"%d",(i+min));
strcpy(copy,"\\単語");
strcat(copy,str);
strcat(copy,".txt");
strcat(p2,copy);
↓
sprintf(p2, "%s\\単語%d.txt", p1, (i+min));
>>208 そうした方が見やすいといえば見やすいですね。
基本的に難しく書こうが、優しい書こうがfopen_s関数の
第一引数はなぜ二次ポインターになってるいるのか
謎が深まるばかりです。その理由は、一次ポインターや
二次ポインターなどマドろこしい理論は置いといて
fcloseやfflushしても、fopen_sでストリームを
複数回開くとまるでゴミのようなバファが出力されてきます。
それは元を辿れば自分がテキストファイルにより出力された物には
違いありませんが、まるで関数作成者のフラストレーションを
吐き出すかのようなオナニークラスです。正直データとして扱かえれません。
ちなみにいい忘れましたが、私の処理系はWINDOWS7で
Visual Studio 2009を使ってます。私の直感ですが、このfopen_sの
二次ポインターは関数ポインターで受け渡すか、FILEポインターで引き渡す
Elmentではないかのどちらかだと思います。いずれにしよ、一つ一つの
処理単位が違うと感じました。
戻り値のエラー情報積極的に使えってことだろ。
>>209 fopen_s(FILE** pFile, ...)になっているのは、そうしないと FILE* の
変数を更新できないから。
本当は成否のerrno_tとFILE*の2つの値を返したいけど、Cではそういう
ことはできないので片方をポインタにしてパラメータに置いている。
つーか、根本的に解ってないんじゃね? そう不思議な仕様でもないだろ。 渡すためじゃなくて受け取るためだからアドレス参照渡しなんだぞ?
>>205 関数内で FILE* file[] ってあるのに、fopen_s() に渡しているのは
fp3[i] だったりしてあやしい。
なんで配列って[0]から始まるんだろう。 int a[10]ってやったら a[10]はないとかわかりづらい。 [1]からはじまればいいのに。
満年齢と数え年の違いみたいなもんだ。
>>214 それが嫌なら OPTION BASE 1 を指定してVBでも使ってろってこった
ろくに勉強しないで長い感想文ばっかり書いてる奴は そういうのが誉められる世界へ行けよ
>>213 すいません。
if( (err= fopen_s(&fp3[i],p2, "rb,ccs=UNICODE" ))!=0)
じゃなくて・・・ ↑
if( (err= fopen_s(&file[i],p2, "rb,ccs=UNICODE" ))!=0)
ですよ。ソースからコピペする時にミスりました
テヘ
>>212 アドレスの参照渡しですか!!!
fopen_s()が二次ポインターを要求してるから
三次ポインターを使えって事ですかw俺はC言語
仙人じゃないので判りません。ちなみに、マドロこしいの
嫌いだからFILE *file[MAXSIZE]は2ch転機上は
openstream()内で宣言してますが
実際に使うときはグローバル変数で使ってました。
三次元ポインターとか、敷居の高いことできるなんてさすが
C言語の世界を極めてた人は違いますね
うぜえ
ポインタの敷居が高いと感じるなら適性が無いと言う事。 早々に見切りをつけて別の道を行った方が良い。
ポインターなんて int x; int *p; p=&x; 三次元だろうが参照だろうが全部これをちょっと形変えただけじゃん。
*p pのポインタ **p pのポインタのポインタ ***p pのポインタのポインタのポインタ 何が難しいんだか
配列?に置き換えれば、少しはわかるかも
わかりやすいポインタ講座 アドレス10000に書いてました xをみつけたいならアドレス20000を見ろ アドレス20000に書いてました xをみつけたいならアドレス30000を見ろ アドレス30000に書いてました xをみつけたいならアドレス40000を見ろ アドレス40000に書いてました xの値は0xABCDです。
よくある間違いは領域確保してませんでしたって奴じゃろ
理解していても領域確保を忘れる事は往々にしてあるが、間違い以前に「理解できない」らしい。 なんで理解できないのかは理解できないが、きっと適性が無いのだろう。
ポインタ自体はコンパイル時にサイズを情報として持ってるだけで難しくは無いけど 文法の法則性を理解するまでが小難しいんだよね
自己参照型構造体でリストを作ったときに、初めてポインタとtypedefが理解できた
リストはポインタの勉強になるよね 車輪の再発明がどうのこうの言ってないで一回はやっとくべき
車輪の再発明って? 言語も大事だけど、アルゴリズム(とデータ構造)はもっと大事だから勉強し
「車輪の再発明」って言葉の意味を勘違いしてるヤツ多いよな。
ポインタとかけて車輪と解く その心は? どちらも頭から入らず、先ず慣れ親しんだほうが(経験則を多数集めたデータベースを作る)上達は早い どちらも真の理解は非常に難しい。
真の理解ってなんだよw
車輪・・・??
C言語ってちょっと応用すれば ただのint型をメモリアドレスを入れておく変数として使えるな。 その辺のプログラミング言語だとこんなに簡単にメモリアドレス使えないな。 Cは便利だな
>>223 判断の材料が不足しており、これだけではなんとも。
>>238 それは環境依存。その昔は sizeof(int)
sizeof(int) != sizeof(int *) な環境もあった。MS-DOS の far とか。
今時の64ビット環境もそうだよね。だいたい、LP64かLLP64だし。 もちろん、今ならintptr_t/uintptr_tがあるんだけど。
6502 の int型は何ビットだ? アキュムレータが8ビットだから8かな? アドレスは16ビット使えたよな?
8086のセグメントモデルもそうだけど、ポインタが整数にキャストできるか どうかは保証できないよね 昔のワードマシンでは、バイトアドレスを指すために ポインタは2つのデータ(ワードアドレスとオフセット)で出来てたらしいし
ポインタがあるんだからよっぽど特殊な環境じゃなきゃ素直にそれを使えばいいんだよ。
そりゃそうだ でも mmap の返り値がエラーかどうか判定する場合みたいに なんか気持ち悪いこともあるよね
単にアドレスを入れておきたいならvoid *、 メモリを1バイトずつアクセスしたいならchar *、 他の言語とやり取りするなら十分なサイズの整数型… 便利。
248 :
デフォルトの名無しさん :2009/11/23(月) 20:27:37
文字の比較についてやってるんだけど その文字列が10000まであって プロンプトにコピペすると500くらいで入力できなくなる どうしたらいい?
それはC言語には関係ないな。
標準入力を使う
ファイルでもおk
バッファサイズを増やせばいいだろボケ そんなこともわかんねのかよ?
環境によっては増やせんでしょ
254 :
デフォルトの名無しさん :2009/11/23(月) 21:43:58
リダイレクションで解決しました
>>186 返事遅れて本当に申し訳ございません
ありがとうございます。
int int_bits(void)
{
return(count_bits(~0U));
}
のどこにunsignedのビット数を割り出す要素があるのでしょうか?あとここだけなのでどうかおしえていただけないでしょうか
お願いします
>>255 count_bitsでunsignedのビット数を数えてるでしょ
0Uの反転でALL1にしてるのがミソ?
ポインタは、アドレスだけでなく、サイズも持っている。 たとえば int x=10;としてintのサイズが4バイトであるとして xが12345678というアドレスにあるなら &xは12345678、12345679、1234567A、1234567B の4つのアドレスを保存する。 実はポインタとはアドレスの配列だったのである。
はぁ? 寝言は寝て言ってくれないか
なんでC言語って不必要なくらいたくさんの数字の型があるんだ?
関数ポインタの表記法は複雑すぎる。もっとすっきり出来なかったのかね。
char, int, float, doubleの4つだろ ああ、C99の話か
サイズ情報はコンパイラのためのものだな。
基本型は char と int の2種類だけでいいよな。 その他は拡張として任意で実装で。 浮動小数も標準から外しておけばよかった。
>264 他に何があるのよ _Boolと_Complexですか
それ以前にヒープを破壊している。全然不思議な現象じゃない。
メモリが3GBとか4GBとかになった今 malloc(100)程度でNULLになるわけないから if(NULL)省略していい?
>>270 だめです
今すぐC言語から離れて下さい
if(NULL)hoge(); hoge()は実行されないんで、省略可
273 :
デフォルトの名無しさん :2009/11/24(火) 04:27:14
printf("%f", 10); // の後に何らかの関数、更にその後で printf("%f", 10); とやると、printfは両方とも異なる値を返します。 フォーマット指定子と引数の型が違うからおかしくなるってのは分かるんですが、 何故そういう動きになるのでしょうか?
>>273 printf("%f", 10, 0);
でおk
>>273 %fに対応する引数を読もうとして、10と一緒にスタック上のゴミも拾っちゃうんだろ。
返り値が変わるってのは、間の処理でたまたまそのゴミが変化してるんだろうな。
276 :
デフォルトの名無しさん :2009/11/24(火) 10:29:16
>>273 その printf を呼び出しているブロックから抜け出るまで
スタックは詰みっぱなしにしておき、最後にまとめて解放
という処理系はあった
そのような処理系では1回目の printf と2回目の printf が
見ているメモリのアドレスが異なることになる
>>273 %fで8バイトのデータをスタックから読み込む
しかし関数に渡しているのはint型の4バイトのみ
残りの4バイトの値は不定なので実行するたびに異なる値が出る
表示が違う、んじゃなくて 戻り値が違う、ってことだろ? printf の戻り値は書いた文字数だから、 表示が違えば戻り値も変わるの当たり前だろ。 printf("a") なら戻り値 1 だし、 printf("aa") なら戻り値は 2 だ。
fwscanf関数の書式をどんなに変えても習得できません。 ワイド文字から整数を取り出すのにはどういった手順を 踏んだらいいか、教えてください。 main(){ int num; wchar_t str[30]; FILE *fp; errno_t err; f( (err= fopen_s(fp,"samep01.txt", "rb,ccs=UNICODE" ))!=0) exit(1); fwscanf(fp,"%s %d",str,&num); }
あ、ちょっとまった fwscanf(fp,L"%s %d",str,&num); これに訂正
まずファイル開くところから直せ。
283 :
273 :2009/11/24(火) 14:11:42
回答ありがとうございました。 確かに表示も違いますが戻り値も異なりました!
>>282 &抜けてたw
それは視野に入ってました
問題はワイド文字から整数をどうやって得るかです
wcstol
288 :
デフォルトの名無しさん :2009/11/24(火) 19:32:02
釣り針でかすぎ
fwscanf関数でワイド文字から整数を抜き出すのは不可能なのでしょか? MSDNの関数の説明にはfwascanfでint型も格納できるみたいなことが書いてあります
>>256 >>257 なるほどやっと理解できましたありがとうございます!
これからもわからないことがありましたら聞かせていただくくことことがあると思いますのでそのときはよろしくおねがいします。
>>289 ファイルのエンコードが違うとか、
文字列が空白を含むとか、
そういうオチ?
ちなみにメモ帳の内容はこれです 「0 指南48.txt 竹やぶ.mp3 アナルファックで君を独占」
void func(void); void main() { int a; a=1; func( ); } funcはmainとは別のソースファイルに記述してあるものとします。 この状態で、グローバル変数や引数を使わずに、func内で上で定義したaを使いたいのですが どういった方法があるでしょうか? 同じスコープ内だから、funcが書いてあるソースファイルの上に、extern int aを追加して たのですが、コンパイラに定義されていないと言われました。
定義と宣言は違う。
引き数を使いたくないなら間接的にやりとりするしかない。
そのやりとりの方法を教えてくださいって言ってるんです。 文章読めないんですか?
グローバル変数使わずにとか言っておきながら いきなり自分ですぐにルール破っちまうのな。
アナルファックとか、いったら顔真っ赤にしちゃって チン毛の生えてない消防かよ。
別ファイルじゃなくて同ファイルだとしても、 引数でもなくグローバル変数でもないmain内の変数aを func()内で使う方法なんてないと思うんだが。
グローバル変数も引数もどっちも無しとなるともうC言語の範疇では無理だな。 スタックポインタの値から辿って探すとかすれば?
304 :
296 :2009/11/24(火) 20:59:37
>>299 は自分ではありません
やっぱりグローバル変数を使わないと無理ですよね。
まず設問が曖昧なんだよな。 引き数禁止、ってのが func() の引き数として渡すのが禁止ってだけなら簡単なんだが。 引き数自体を全面禁止されるともう無理だろ。
時代は32bit必須なのに、お舞らの頭の中は16ビットマイコンか wchar_t型で宣言するんじゃなくて、wint_t型で宣言するんだよ。 このブォケ!!!あなた方の頭の中のClock数が間違ってると思います
wchar_tは16bitでも32bitでもないよ^^ 規格票ではchar以上のサイズがあればいいことになってる。 wint_tも実装定義だし^^
>>295 そのファイルから読み込むのがうまくいったら、numとstrの中身が何になってほしいと考えている?
エンコードされたURLをデコードしたいんだけど、 結果→Shift-JIS EUC UTF-8 になるように、 ライブラリは使わずにやる方法はないでしょうか? また、エンコードされたURLを元は何の文字コードだったのかを判定する方法も教えていただきたいです。 (CodeManager.getcode で実現できるようなのですが、ライブラリのソースが見つかりません。 見れるサイト等ありましたらお願いします。)
URLのエンコードってUTF-8でされるんじゃなかった?
printfで、Hex2桁を表示する方法を教えてください printf("%2X", hoge); では表示できませんでした(8桁になってしまう)
>>311 printf("%2X", hoge & 0xFF);
printf("%2X", hoge&3);
>>311 printfの書式文字列はWindows上の某コンパイラはマニュアルと
実際に食い違いがある(%i)
よってprintf系はWindowsだろうがUNIX系だろうが
慣れるまで思い通り動かないと思ったら別の方法を考えるのが
早いことが多い
たとえば
printf("%s",ToHex(hoge));
char *ToHex(char hoge){
//ここの部分を自分で埋める
}
char *ToHex(char hoge){
static char hx[3];
hx[0] = "0123456789abcdef"[hoge
>>4 &0x0F];
hx[1] = "0123456789abcdef"[hoge&0x0F];
hx[2] = '\0';
return hx;
}
>>314 ポインタを返すのはまずいんではないか?その返したポインタを delete なり free する必要がでてくるかも。
static な領域ならば、それはそれで別の問題が。
どうゆう問題?
再入可能でなくなる
うーむ。深い。 再帰やマルチスレッド対応まで最初から考慮するのか。
いや、その前に、例えば、
>>315 の実装だと
printf("%s %s",ToHex(hoge), ToHex(fuga));
みたいな使い方ができない。
>>319 こんなんとか
printf("%s %s\n", ToHex(0x12), ToHex(0x34));
322 :
デフォルトの名無しさん :2009/11/25(水) 00:08:44
以下のプログラムの入力部分で、数字以外、つまり英単字などを入力すると暴走し止められなくなるのですが、 どう対策したらよいでしょうか。(プログラムではomikujiなど一部略しています) #include <stdio.h> int main(void) { int select = 0; Do { printf("\n何をしますか?\n 1 おみくじ\n 2 数字当て\n\n 0 終了する "); scanf("%d", &select); switch (select) { case 1 : omikuji(); break; case 2 : omikuji2(); break; case 0 : printf("\n終了しますか? 9:実行 それ以外:中止 "); scanf("%d", &select); if (select != '9') break; } } while (select != 9); printf("\a"); return 0; }
do{ c = getch(); }while((c != '1') && (c != '2') && (c != '0'));
>322 入力部分のscanf()を,fgets()とsscanf()で置き換える。 fgets()した後、入力が数字かどうかを判定し、数字ならsscanf()で解析。 数字以外なら、再度入力を促すなり終了させるなり。
scanf の戻り値を確認すればいい。
こんな感じ。 #include <stdio.h> #define Do do int main(void) { int select = 0; Do { printf("\n何をしますか?\n 1 おみくじ\n 2 数字当て\n\n 0 終了する "); {char b[64]; while (scanf("%d", &select)!=1)gets(b);} switch (select) { case 1 : omikuji(); break; case 2 : omikuji2(); break; case 0 : printf("\n終了しますか? 9:実行 それ以外:中止 "); scanf("%d", &select); if (select != '9') break; } } while (select != 9); printf("\a"); return 0; }
下にもあった……
まあ atoi(gets(buf)) がオススメ。
329 :
322 :2009/11/25(水) 00:51:36
みなさん、短時間で数多くの回答ありがとうございます。
とりあえず、
>>326 さんのプログラムを使いやってみます。
本当にありがとうございました
scanf と数字は鬼門だな。 まあ、練習なんだから誤入力は無いものとして作ればいいと思うよ。 どうせ scanf なんてすぐ使わなくなるしな。 細い仕様なんて覚えても意味が無い。
>311 unsigned char hoge = 0xab; unsigned short shoge= 0xdead; unsigned long lhoge = 0xdeadbeef; printf("%hhx\n", hoge); printf("%hx\n", shoge); printf("%lx\n", lhoge);
gets()は改行を外してくれるから便利だよな。 毛嫌いしてる奴もいるけど。
必ずしもそうでもない 改行の有無を知りたい場合もある
アルゴリズムの勉強って詰め将棋を考えるのとほとんど変わらないな・・・
否定したいんだかなんなんだか 無意味なコメントだね
>>336 ぐぐれ
文字コード変換もコード判定も探せば沢山あるだろ
但し文字コード変換もコード判定も完璧というのは無いので
どこまでやるかは自分で決めなくちゃならない
>>332 gets()を安全に使う方法があるなら使わんでもないが。
MS VC なら gets_s てのもあるが、まあ fgets で何も困らんよなあ。
>>332 scanf() の安全なパターンか、バッファの容量を指定できる fgets() か。
>>332 仕様から安全性を予測するのもスキルのひとつ。
標準ではないが getline(3) 便利すぎる
入門者、初心者、中級者、上級者に分けた場合 入門者と初心者の間はどのくらいのレベルですか? どんなプログラムを組めるようになれば入門者ではなく初心者になれますか?
344 :
デフォルトの名無しさん :2009/11/25(水) 16:53:44
ソース入力、翻訳、エラー訂正、実行、の流れがわかること
>>343 初心者 入門者 初級者 中級者 上級者 入段者 ...
この区別は簡単なようで意外に難し
いが世の中では概ね上の順序に沿
って変化していくことが想定され
ているのではないかと
ただプログラミング言語とか言語に限っては
極度にレベルというものが定義しにくいからな
入門者はある程度本気で学んでやろうと考えた
段階のことなのかも知れない
訂正 ×入門者は ○入門者とは
348 :
345 :2009/11/25(水) 17:11:19
347=345ね
2と3の少し2よりだと思ってる・・・
手前等分からんのかっていう豆知識 リエントラントと、スレッドセーフは全然違う。 スレッドセーフであってもリエントラントであるとは限らない。
1塁がセーフだとヒットエンドランである。
例えばlocaltime()みたいな関数がスレッドIDごとにメモリを確保したら、スレッドセーフでありながらリエントラントではなくなる。
ある変数を変更する関数が400あったとして それらが同時にアクセスするのを防ぐ方法を考えた セマーフォでも何でもいい これはスレッドセーフではあるが リエントラントとは呼べない。
(A) i++; if(i>10) i=0; (B) if(i>=10) i=0; else i++; (A)だと一瞬だけiが10を超えてしまうので、 拙い書き方、になるのでしょうか?
>>354-355 リエントラント
= フローインディペンデント or マルチエントラブル
なんでつね。はじめて聞いたw
ポインタって内部的にはメモリアドレスがどうこうやってるのかもしれないが それを意識する必要はないな。 何らかの手段により参照してる という抽象的な理解でよくて どうやって参照しているのか はわからなくても使えるな。
OSで動くアプリしか作ったことがないやつはメモリアドレスなどどうでもいいと思うかもしれないが 組み込みは、そんな甘い考えは通用しない。
普通そんなもんつくんねーよ^^;
というか、メモリアドレスとかメモリマップとかの概念を考えない奴には まともなCプログラムが組めないと思う
足枷ハメりゃいいのだ 組み込みで自由になるスタックは、2MB。 メインメモリで8MB。 CPUはMIPSやSHの250MHz。 これで携帯電話のようにGUIを備えてレスポンスよく反応し 音楽鳴らせてファイル管理できて・・・・ ってのをやってみればよい OS任せってのがどれほどラクかわかる
>>362 自分が使う携帯電話のOSは作ってみたいな
機能を削ってもっとキビキビ動いて欲しい
スタック 32k 使用可能メインメモリ コード/データ合わせて128k迄 CPU V30 10MHz 1990年代初頭のPCソフトウェア想定環境
>>361 というより、わざわざC言語を使うのはメモリ意識するようなソフトばかりだな。
そうじゃなければ他の言語で済ます。
あと組み込みでは、余程甘い職場以外 標準関数は使っていないのでそこも代替出来るかどうかがポイント。 標準関数を使うとスタックを食いまくり、遅くなる
組み込みの勉強がしたいならGBAプログラミングに手を出すといい
組み込み業界に行く行かないに関わらず、組み込みは勉強しておくと役に立つ。 メモリ管理もそうだが、 if(memori_no_banti == 0x77000000 || memori_no_banti == 0x77000004 || memori_no_banti == 0x77000008) とか switch(HogeraGocho) { case 0x04: Call1(); break; case 0x08: Call2(); break; case 0x0C; Call3(); break; とか、絶対に書かなくなる。こういうのに耐えられなくなる。
GBAってなんですか?ガバ・・・?
それ以前にCで出来る低レベル処理にも下限があるんじゃないかと それを無視してるんじゃないかと思える処理系が多いという 問題意識を持つ人も居る。 (CはPASCAL並みの高級言語だと1980年代は言われていた そうだ)
>>357 リエントラントという用語は、関数の中に居る人?の視点か
外に居る人?の視点の違いで意味が変わってくる曖昧な専門用語
なんで今は特定の分野の文脈以外では使わないほうが良い。
まぁしかし、規格票的にはポインタはあくまでポインタであってアドレス値をどうこうしろとは書いてないんだけどね。
373 :
デフォルトの名無しさん :2009/11/25(水) 21:57:22
C言語でノベルゲームって作れるんですかね?
ええ、もちろん
ノベルゲームって何以下知らないけど 小説みたいな感じで文章と音楽とグラフィック表示するだけのやつなら Cなんか使うよりもっと楽な方法がいろいろありそうだ。たぶん。
C言語だけでは難しいですね。 Windows上でWindowsAPIを利用して作るなら 比較的楽にできますけど。
378 :
373 :2009/11/25(水) 22:08:56
みなさんありがとうございます 分岐みたいなのはなくていいんですけど、 ひぐらしみたいなのがつくりたいんです。
>>372 それは抽象化のためだし、元来規格とはそういうもの。それを鵜呑みにするのは教育的にどうかと。
ノベルゲームを作って遊ぶ目的でC言語の勉強を同時にしてしまおう という考えは捨てた方がいいかもしれない
>>379 つまり、実装によってはアドレスではない可能性もあるってことよ♥
382 :
デフォルトの名無しさん :2009/11/25(水) 22:13:16
お願いします。 全くの初心者ですが、初心者向けの分かり易い本があれば教えて頂けませんか??
383 :
373 :2009/11/25(水) 22:14:25
>>380 そうなんですか。
初心者なんですいません。
C言語とは何をするものなんですかね?
抽象的でごめんなさい。
いやいや、個人的には超お勧めの考えだと思うよ。 何かを作るっていうモチベーションがあるとないとでは 学習効率がぜんぜん違うから。 珍妙な言語を学ぶくらいなら、 最初からK&R第二版とプログラミングWindows上下を購入して ごりごりWindowsプログラミングの勉強をした方がいいと思うくらい。 実際、この3冊を読めば、ベクトルグラフィックも、ビットマップグラフィックも、 印刷もタイマもMIDIもマルチスレッドもインターネットも全部使えるようになる。
>>383 C言語を勉強するとノベルゲームも作れるかも知れないが逆は真ならず
という奴じゃないの?
>>384 うんそだね。珍妙な言語で動作する珍妙なアプリケーションを作る
ぐらいWindows-APIやCの様々な技法を駆使できる機会は無いからね
387 :
373 :2009/11/25(水) 22:29:56
>>386 ごめんなさい。
もっと勉強してきますノシ
>>383 GNUとかのサイト行けばわかるが、多くのプログラミング言語
処理系のソースはほぼC(C++やObjective-CやJavaもあることは
あるが)
言語が絡む分野では圧倒的な強さというか実績があるんじゃないかと
しかしポインタってのは、元々アドレス経由でメモリをいじるためのものだ。 なぜなら、Cとはアセンブラの代替を意図して作られた言語だったから、 アセンブラができることはCでもできねばならなかった。 アドレスに入った値を指し示すというのは副次的な産物であって それが主目的なわけじゃない。 アドレス経由でメモリをいじる機能を値や関数に適用してみたら 覚えておけるようになったってだけだ。 まあ値も関数もメモリに乗ってる時点でメモリいじりと等価なことだが。
ディスプライドライバとか、BIOSでさえCで書かれている。 メモリいじりができるからだ。 もちろん本当に高速な処理が必要なところはアセンブラで書かれているが、 C 9 : ASM 1 といったところ。 Cとは結局、人間にとって分かりやすい言語体系になったアセンブラなのだ。
>>381 想像するのは勝手だが、そのような実装は存在するのでしょうか?
>>391 プロセス毎にメモリアドレスが独立している
↓
異なるプロセスのメモリを書き換えることが出来ない
↓
アドレスでは無い
とも言えるんじゃね?
物理アドレスと論理アドレスが云々
>>391 しらね^^
ただ、メモリにアドレスが振られていないハードや
アドレスが一意でないハードは存在している。
DOS時代にFarポインタとNearポインタなるものがあったそうだけど
その時代には生まれてないので知りまへん^^
あと、仕様的にはポインタが保持しているのはアドレス値ではなく、ポインタ値。
int の 1 と double の 1 が同じビット列とは限らないのと一緒で
int *の 1 と double * の 1 が同じビット列とも限らない(規格票には書いてない…はず^^)。
ポインタがメモリにメモリにアクセスする道具であるのは事実で
しかし、アドレスから一定の抽象性を持って分離していなければならないって感じ?
論理アドレスは単にOSが提供する機能 物理アドレスは、メモリコントローラにアクセスしてやればCでも読み書きできる。 BIOSはもちろんそれをやっている ただページ参照やタグからどうこうだの縦横のアドレスだの ここいらあたりはCよりアセンブラでやったほうが遥かに短いコードになる
なので、論理的には32bitOSであっても16GBや32GBのメモリを扱えることになる。 32bitOSが4GBまでというのは、あくまでOSが提供する論理アドレス<->物理アドレスの変換マップのワクが 4GBまでというだけであって、自分でメモリコントローラにアクセスしてページングしてアドレッシングして、 とやってやれば、メモリコントローラが扱える上限いっぱいまで使用できることになる。 アプリケーションはOSの論理アドレスに依存しているから使えなくても RAMディスクなどとして使うことだってできるはずだ。 理論上はそうだ。
それはないわ。void * との相互変換は保証されてるんだし。
あり? void* が 他のポインタ型と相互変換可能なことは 両者のビット列が同一であることを保障する旨の記述あったっけ?^^;;;スマ
void* のビット列って何?
near、farのことかな。 懐かしいw
>>386 Windows上のVC開発のこと?珍妙って某BASICコンパイラのこと?
Windows開発では通用しているスクリプト言語をそれなりに知らないと
辛いだろ。Cだけじゃ駄目なことは間違い無し。
Visual C++ 2008 Expres Edition を使っています。 1〜9の数字を並べて表示させようと思っていて、 int C[9]={1,2,3,4,5,6,7,8,9}; を最初に作ってます。 そして一度でも使った数字には0を当てはめます。 k=0; do{ printf("数を選んで下さい\n"); while(k<9){ if(C[k]!=0){ printf("%d\n",C[k]); k++; } 最初に1〜9を表示させるにはどうすればよいですか?
sizeof(char *) <= sizeof(int *) <= sizeof(double *) <= sizeof(void *) bit pattern
printf("123456789\n");
printf("1〜9\n");
405 :
デフォルトの名無しさん :2009/11/26(木) 00:39:50
>>322 これの対策だけど、switchで振り分けてるならdefaultでいったん振り分けて、
影響されない適当な数を代入する じゃいけないかな?
すこし前進できたと思います。 あとは頑張ってみます。ありがとうございました。
407 :
デフォルトの名無しさん :2009/11/26(木) 00:50:35
>>405 無理だろ
簡単にしたいならintでなくcharにして最初に0を入れておけばいい
>>401 何をしたいのか今一つ分かりませんが、
推測で、
#include <stdio.h>
void main(void)
{
int C[9]={1,2,3,4,5,6,7,8,9};
// を最初に作ってます。
// そして一度でも使った数字には0を当てはめます。
int k=0;
printf("数を選んで下さい\n");
while(k<9){
printf("%2d",C[k]);
C[k]=0;
k++;
}
putchar('\n');
}
409 :
401 :2009/11/26(木) 01:19:40
みなさんの意見のおかげで解決できました。 ちなみにアカギが死ぬ直前にしたギャンブルの ナインを作っている途中です。 二つめの数を選んで勝負のする時、一度使った数字は 使えなくするために0を入れています。 とりあえずは↓ do{ printf("ここから数を選んで下さい\n"); while(k<9){ if(C[k]!=0){ printf("%d",C[k]); } k++; } printf("\n"); k=0; これで数字の表示はいけそうなので次の作業をやってみます。 いきずまれば、また見直してみます。 みなさんアリガトウございました。
ゲームPGは面白いんだろな。ただ脳の爆発には注意
411 :
401 :2009/11/26(木) 01:28:22
勉強を初めてまだ2週間なので簡単なナインくらいしか作れませんが、 もっとできればいろいろルールを増やせて楽しそうだなと思ってます。
int a[2]; printf("%d", sizeof a); これは 8 なのか 2 なのか、あるいは 4 なのか、 どれが正しいの?
実行するなり規格票見るなりすればいいじゃん
理由どうこうじゃなく、単に規格票で同じことが保証されてないってだけでしょ。
処理系に依存するからこそsizeofがある。 まさに「逆に考えるんだ!」だな。
別に整数のサイズが処理系依存しなくてもsizeofは必要
sizeof a/sizeof intが2になることは規格票で要求されていますか?
かっこ付けろボケ
さあ。 配列というものはそういうものでないと困るがな。
てことは wchar s[8]; fgetws(s, sizeof s, stdin); は間違いというわけだな? TCHAR 使って fgets と切り替えにしてるとマズいわけだ。
>>401 面白そうだから、ナインのルールを教えてください。
#include <stdio.h>
#include <string.h>
int main(void)
{
char numLst[10]={0}, buf[64], lstIdx, numSlct, remain, i;
strcpy(numLst, "123456789");
remain=9;
do{
for(i=0; i<remain; i++)
printf("%2c", numLst[i]);
putchar('\n');
do{
printf("数字を選べ : ");
gets(buf);
sscanf(buf, "%c", &numSlct);
for(i=0; i<remain; i++){
if(numSlct==numLst[i])
break;
}
}while(i==remain);
if(i!=remain-1)
memcpy(&numLst[i],&numLst[i+1],sizeof(numLst[0])*(remain-i));
numLst[remain-1]=0;
}while(--remain);
puts("終わり");
return 0;
}
>>345 初
こ
い
っ
て
た
極
入
段
…初恋が何だって?
>>422 そこで
#define numberof(v) (sizeof(v) / sizeof *(v))
ですよ
XNAってマジキチいな。 C#なら入門サイトも結構あるがXNAのサイトって日本にはほとんどない。 MSDNみてもいきなり専門用語の羅列で何やりゃいいか意味不明。 これでゲーム作ってるひとっているの?
まちがえた XNAってCとは関係ないのか
アホがよく勘違いする豆知識 「scanfはバッハオーバーフローする!」 しない。 なぜするのか。 scanf("%d", &FuxckingToshing); こうでなく、 scanf("%10d", &FxckingToshing); とすればオーバーフローなどせん。 これを知らないやつが多すぎる。
オーバーフローはしないが、オーバーランはするわけで。
>>428 %d ってw
%100s とか %255[^\n] とかじゃねーの?
%10dなら10桁以上取らない %3dなら3桁以上取らない
誰も聞いてないのに、わざわざ恥晒しにでてくる
>>428 は公開調教中のMだと思う。
むしろ
>>428 が何をオーバーフローと言ってるのか気になる
>>434 さすが大学だと難しいことやるんだな
課題の方は全然わからんw
プログラムソースに問題がなさそうに見える。
とりあえずソースファイルの文字コードを EUCあたりにしてみては?
18行目は代入してるんだが、いいのか? その前のは文字コードだろうな。
437 :
436 :2009/11/26(木) 20:18:54
…ていうか report4.c って UTF-8 かよw
で、エラーがいかにも某ランド 某ランドのコンパイラ5.5は ansi以外のファイルではマトモにコンパイルできない。 C99にも準拠しておらず、俺の大好きなlong long intが使えない
439 :
sage :2009/11/26(木) 21:05:25
数百回分の計算データがありそのデータを10回毎に見ていって(10回目、20回目、30回目…)前にみた時より、 aが50増えたらaをbに変更するもの作りたいのですが、どなたかアドバイスください。
独自の64bit整数があるはずだが、使おうとするときに思い出せないw
441 :
434 :2009/11/26(木) 21:09:06
>>435-438 文字コードが問題ですか
お察しの通りボーランドなんですがw
EUC-JPにも変えてみましたが、エラーが変わらないというのはBCCdevloperのせいですかね…
違うコンパイラ探してみます
>>436 a1=0,b1=1という指定があったので、条件を満たさない場合にはループさせようと思ったのですが記述間違ってますか?
>>441 ak==0 && bk == 1 じゃないとおかしいが、
そもそも値が決まってるなら入力させる必要はないだろw
444 :
素人学生その5 :2009/11/26(木) 21:20:48
はい!!! 先生!!!!質問があります!!!! 今作っているプログラム内で使用しているAPI(とあるソフト)を最新版に更新したらなぜかシステム終了時にアクセス違反が発生するようになってしまいました. どうもatexitを抜けた後,crt0dat.c内のif(__onexitbegin){}を3回ほどループして,この関数を抜け出すところ(?)でアクセス違反が起きているようです. どうやったら解決できるか教えてください!! ちなみにAPIを更新する前は問題ありませんでした.
1からnまでのすべての奇数の和を求めたいです。
1からnまでの全ての奇数を足してください
>>444 APIの正しい使い方をしてください
今までは運良くエラーとして出なかっただけです
ありがとうございます。
>>445 ((n+1)/2)*((n+1)/2)
450 :
素人学生その5 :2009/11/26(木) 21:37:07
>>447 仮にAPIの使用方法が間違っていると,exit時にアクセス違反が起こる可能性があるとうことでしょうか?
451 :
434 :2009/11/26(木) 21:45:15
>>442 ようやくいけました!
ありがとうございます
>>443 ==でしたか 助かりました
ヒントの流れ図に入力を促す文等があったので、入れた方がいいのかな…とw
アホがよく勘違いしている豆知識 API アホはAPIというと、「どっかのライブラリ」 としか思っていないが ドライバとユーザー入力のインターフェイスならば何でもAPIなのである。 どこぞの会社が作ったライブラリ云々は一切関係ない。
いもしないアホを勝手に妄想して叩くとはw
誰も聞いてないのに、わざわざ恥晒しにでてくる
>>452 は公開調教中のMだと思う。
freeした後にNULL入れ忘れてたとか
すいません。セグるってそもそも何なんですか。不正なアドレスと不正じゃないアドレスって何を基準に判断してるんですか
タイマーユニットがないCPUで、タイマーを使うにはどうすればいいの。 パルスつっても使い方が分からない。 forループだとCPUによって時間がズレるうえに、ループしてる間はCPUのリソースを食っていることに他ならないわけで
ステート数を足し算して時間を調整するとか
アホが組んだせいでいろいろ大変になった豆知識 昔のゲームが動かない 15年くらい前の98全盛期、4MHz機だと正常に動くけどそれ以上だと動かない などというゲームがあった。なぜだろうか。 答えは簡単、初期化やメモリへのロードをforループで待つという、素人も真っ青の方法で待っていたからである。 4MHz未満機で「だいたいこんくらい待てばいいや」と、ソフトウェア的にタイマを作って回していたので それよりも速い処理族度を持つ機ではループ完了までの早さが変わってしまい、 初期化が行われなかったりメモリにまだ乗ってないのに次の処理に行こうとしたりして動かなかったのである。
>>461 Windows95 ってCPUが高速だとインストールに失敗するらしいぜ
3 へぇ
15年前に4MHzのマシンなんてもうないと思うが。
世間の標準は33MHzとかくらいだな。
>>458 何も無いメモリ空間に神がメモリを割り当てる。全部は割り当てられないから、一部だけだ。
割り当てられた部分が不正じゃないアドレス。まだ割り当てられていない部分が不正アドレス。
>>459 その昔、vsync割り込みと言う手法があってな… ようするに使えるものは何でも使う。
468 :
デフォルトの名無しさん :2009/11/27(金) 00:26:29
>>461 4Mhz って何?
98 って 5Mhz 系とそれ以外だったろ
Z80
88は4MHzでSR以降は8MHzと切り替えあったからそれのことなんじゃね? 20年以上前の話だがな。
471 :
401 :2009/11/27(金) 01:14:55
>>423 アカギが死ぬ間際、最後にしたギャンブルです。
トランプでも雀パイでもできるギャンブルで、
相手も自分も1〜9のカードを用意して好きな数を選んで出す。
自分が5を出して、相手が3とかなら、数字の大きい自分の勝ち。
自分が5を出して、相手が6とかなら、数字の大きい相手の勝ち。
自分と相手が同じ数なら引き分け。
9枚消費しきった後の結果で、勝利数の多いほうの勝ち。
相手の使ったカードを覚えておくなどの戦略がある。
6502 こそ真の CPU.
プログラミングは初めてで とりあえずC言語を勉強したいのですが そこで必要となるコンパイラ?でおすすめはありますか?
文字列がワイルドカードと一致してるかしらべる方法はありますか
自己解決しました
正規表現
ワイルドカードと一致って どんな状態だよ?
>>473 Turbo C 2.01 オススメ。
統合開発環境付きが欲しかったら
Turbo C++ 1.01 でもいい。
Borlandのコンパイラは使えない娘ですかそうですか
481 :
デフォルトの名無しさん :2009/11/27(金) 14:28:56
char s[64]; memset(s,49,sizeof(s)); これは初期か時末尾についたnullを塗りつぶす?つぶさない?
日本語でおk
今C言語の課題をやっているんですがよくわからないので教えてください。 問題文 任意の画素数をもつ画像をアフィン変換するプログラムを作成しなさい。 変換処理後の画像はファイルとして保存するようにしなさい。
Borland C++ 5.5.1 for Win32を使ってC言語を覚えています。 char型について質問です。 charに数字を入れるとマイナスになったりして面白かったので signed char var1 = 200; printf("符号付\t %d\n", var1); というコードで色々な数値を入れて試してみました。 var1 = 0; 00000000→ 0 var1 = 127; 01111111→ 127 var1 = 128; 10000000→-1 var1 = 255; 11111111→-128 予想ではこういう風に8ビットの一番左の数字でプラスかマイナスかを判断し あとの7桁が値を表すのかなとなると思いました。 これだと符号を反転させるときも一番左の数値を変えるだけだから便利だなと思いました しかし実際にやってみると var1 = 0; 00000000→ 0 var1 = 127; 01111111→ 127 var1 = 128; 10000000→-128 var1 = 255; 11111111→-1 となりました。このほうが何かメリットがあるのでしょうか。 どうしてこういう仕様になっているのか知りたいです。どなたか教えてください。
2の補数でググれ
ボーランド人気ありすぎ
>>484 足し算などで符号を気にせず同じ様に処理できたりとか
0 + 1 = 1 ・・・ 00000000 + 1 = 00000001
-128 + 1 = -127 ・・・ 10000000 + 1 = 10000001
C言語の話じゃないな 2進法がわかってないだろ
ソーラン節である。 2進来たかとカモメに問うたのである。 ワケがわからない。
is系の関数を使う時に引数をunsigned charにキャストするのは何故なんでしょうか? 調べて見ると、引数として渡せるのは0-255とEOFということなんですが unsignedだとEOFが渡せないと思います。
>>490 EOFを渡す必要がないからでは?
EOFを渡す必要があるなら、渡せるように書くと思うが
>>490 キャストなんてせずにintのままで扱います
>>493 それをやると非ASCII文字を渡したときに未定義動作。
言葉が足りなかった。 signed charに入った非ASCII文字や256以上の値を渡したときに未定義動作。
文字を int として扱うのは getc 類を使う時だけで充分だよ。
>>490 太古の昔isxxxxはテーブル参照するマクロだった。その時代の名残。
キミのように疑問を持って理由を考える奴は使わなくなる。
コピペを繰り返すしか能の無い
>>493 のようなヘボはいまだにキャストしている。
今はテーブル参照じゃないの?
500 :
484 :2009/11/27(金) 18:34:54
>>485-489 減算を加算で出来るというのが大きな理由のようですね
皆さんレスありがとうございました
一体どこからそんな結論を導き出したんだ?w
回路設計の面から見たときに、加算器を使って実現できるからっていう 理由があるんで間違ってはいない。
#include <stdio.h> #define MAX 1000 int main(void){ int a, b, c, count = 0; for(c = 1; ; c++){ for(b = 1; b <= c; b++){ for(a = 1; a <= b; a++){ if(c*c == b*b + a*a){ printf("(%d, %d, %d)\n", a, b, c); if(++count >= MAX) return 0; } } 三辺が整数の直角三角形を出力するプログラミングを作ってるんですが、同じ比率の結果を排除したいのですができません。 どのようにしたらよいでしょうか? 例えば3:4:5が先に出力されていたら6:8:10は出力去れないようにするといった感じです。
素数でない辺は飛ばせばいいんだよ
1:3(9)+4(16)=5(25) 2:5(25)+12(144)=13(169) 3:7(49)+24(576)=25(625) 4:8(64)+15(225)=17(289) 5:9(81)+40(1600)=41(1681) 6:11(121)+60(3600)=61(3721) 7:12(144)+35(1225)=37(1369) 8:13(169)+84(7056)=85(7225) 9:15(225)+112(12544)=113(12769) 10:16(256)+63(3969)=65(4225) このように出したいんだね? そりゃ多分無理だ
80歳の耄碌爺婆になってから考えれば良いこと
507 :
490 :2009/11/27(金) 19:45:10
みなさんありがとうございます。 EOFを渡す必要がないということで納得しました
>>503 int gcm(int a, int b) { return a % b ? gcm(b, a%b) : b;}
を追加して、
if(c*c==a*a + b*b && gcm(a,b)==1)
にする
>>503 >排除したいのですができません。
チェックしてないからじゃね?
>例えば3:4:5が先に出力されていたら
それまで出力した組み合わせをすべて覚えておかないと
判断できんわな。
>>503 宿題スレで答えてもらってんのに理解できなかったのかw
511 :
デフォルトの名無しさん :2009/11/27(金) 20:06:52
ううーむ 俺は今まで ポリデントとかどうでもいいじゃん、と思っていたが トゥーーチャノォ(英語は発音大事)などで半角スペースやタブが削除され ポリデントされてないソースを見たら やっぱタブは大事だなと思った
Google Coding Standards ではスペース2個にしろ、タブを使うなと書かれている。
>>513 そういう マナちゃんの あそこもちょっと...
>>509 んな馬鹿な。最大公約数が 1 でないものは省けばいいのでは?
それが508なんだが、503には多分理解できない
あれだよ、gcmが大文字でGCMと書かれてないからだよ。 大文字で書かれてれば「最大公約数」ってすぐわかる。 この略号、中学校で全員習うからね。
ググレカス
GCD or LCM
Turbo C++ 1.01入れてみたのですが、日本語入力不可?
Greatest Common Divisor 略してGCD Greatest Common Measure 略してGCM どっちも最大公約数をあらわす。 最小公倍数LCMのMと混同してるわけではないので、 下手に突っ込むと逆に恥をかきます。
入力以前に日本語モードじゃ動かないだろ。 CP437専用だったはず。
素直にmingw薦めればよいものを…
527 :
423 :2009/11/27(金) 22:50:37
>>471 演出によって面白いゲームになりそうですね。
キャラクター選択や、それぞれと戦うに至った状況設定などを入れたりすると、
友人間の話の種になりそうです。
練習になりそうだから私も単純な骨組だけ作ってみます。
自己流なので洗練とは遠いですが。
定数にenum使ってるんだけど ビットマスクとかには使わないほうがいいのかな サイズと符号があいまいだよねこのこ
つーか、初心者で C 言語の勉強を始めるなら とりあえず日本語関連は後回しにしたほうがいいよ。 日本語使うにしてもローマ字で書けばいいしな。 文字列いじったりするのに、かな漢字が入ってると 文字コードがどうとかで面倒だろ。 とりあえず ASCII 文字だけで一通り覚えてからだな。
皆がそう考えて罠にハマるw
罠ってなんだよ? ASCII で一通り覚えてから、 それから日本語をワイド文字で使うことを覚えれば良い。
訂正。 「日本語を」じゃないな。 かなや漢字を、だな。 ローマ字でも日本語は日本語だもんな。
Turbo C++入れてコマンドプロンプトにusって打ち込んで英語モードにしたら英語が標準になっちまった… jpとかchcp使っても戻らなくて、こんな時間orz
jp ってのはバッチファイルで、 中身は単なる chcp 932 だろ。
CP932 ってことは、 コマンドプロンプトって Shift-JIS なの? NT 系の Windows って Unicode なんじゃなかったか? UTF-16(LE) じゃないの?
Windows内部ではUNICODEで処理されているけど インターフェース(コマンドプロンプト等)は基本Shift-JIS ・・・だったはず
537 :
423 :2009/11/28(土) 02:20:06
538 :
423 :2009/11/28(土) 03:31:36
52行:&nLstPlr -> &nLstPlr[0] 90行前後:if 文の {} のありなしを統一したほうがいい 入力のところと結果発表とのところで 関数化するといいんじゃない? ex) void selectLst(char nLstPlr[], char *idxPlr); ex) void showScr(ROUND Round[]); ラウンド判定の部分は悩むところ ex) void showRnd(char num); ex) void showRnd(char num, ROUND round[]); あとほとんどの変数は、char型にこだわらずに int型で書いたほうがすっきりしていいkかと ex) int nLstCom[10]={1,2,3,4,5,6,7,8,9};
そのmemcpyの使い方って未定義じゃねーの?
未定義だな memmoveつかうべき
542 :
423 :2009/11/28(土) 06:52:16
543 :
デフォルトの名無しさん :2009/11/28(土) 10:14:07
n=++func(); こういうのってできる?
試しても、その処理系における動作しか確認できない。
逆に言えば、規格を知ってもその処理系の動作は確認できない
処理系依存のソースは現金
a,b,c,d,・・・,aa,ab,ac,ad,・・・,aaaa,aaab,aaac,・・・ のように順番に文字列を関数に渡していきたいのだけれど再帰でやるのとforでどんどん渡していくのとどちらがよさそうですか?
「のように」がよく分からないが、a〜zを使った26進数の数値の連番てこと? 多分forの方が簡単
10進数から2進数への変換なんですがどうもうまくいきません (最大値は65535とする) #include<stdio.h> int main(void) { int num[80],n,i=0; printf("10進数を入力:"); scanf("%d",n); while(n!=0){ num[i++]=n%2; n=n/2; } while(--i>=0) printf("%d",num[i]); return 0; } 10進数を入力:18 10000001101000011000100 よろしかったらご教授願います
> scanf("%d",n); まずはこれ。 値渡しでは入力を受け取れない。 scanf("%d",&n); のようにして n のアドレスを渡せ。
>>549 具体的には文字コード00からFFまでの一文字、二文字のすべての組み合わせ、三文字のすべての組み合わせとやって
八文字のすべての組み合わせまでやろうとしてる
人は、なぜ条件判断に変数を用意しますか。 int ON, OFF, GOOD, BAD; 例えば ON = 1; if(ON == 1) else if (OFF == 1) なんでこんなことしますか。 1コでいいじゃないですか int GOODING; //以前のON=1と等価 GOODING |= 0x01; //以前のOFF=1と等価 GOODING |= 0x02; なんで無駄に変数を用意しようとしますか。
>>552 文字コード00を含めると、文字列の終端と区別つかなくなるのでは?
>>552 8文字の全組み合わせって8バイトのデータが 2^64 個だよ?
そんなデータ置く場所があるのかい。
>>551 解決しました
初歩的なミスで恥ずかしい限りです
ありがとうございました
順列組み合わせは再帰を使った方がソースはスッキリするがforループのがスピードは速い
558 :
458 :2009/11/28(土) 14:05:38
>>558 個人的にはそういう書き方も分かりやすくて好き。
再帰だと、こんな感じ
char a[10]={0};
sub(int i, int len)
{
int c;
for(c=0x00; c<= 0xff; c++)
{
a[i]=c;
if(i == len) func(len, a); /* bが文字幅の場合 */
else sub(i + 1, len);
}
}
main()
{
int len;
for(len = 0; len <8; len++)
sub(0, len);
}
リテラル派
562 :
458 :2009/11/28(土) 14:30:04
優先順位を分かりやすくするため 誰でもわかってる数学のルールどおりであっても カッコをつける ABC = (A + (B * C)); (((((((((((((((((((((((((((; ゚д゚))))))))))))))))))))))))))))))))) これはやりすぎである。
(ABC = (A + (B * C)));
ここで Lisper 登場!
563みたいなバカと一緒に仕事するハメになったら、 どんだけカッコつけてもやりすぎってことはないだろw
M = (N = ((S = A + B) + (C * D)));
下の素数を求めるプログラムについてなんですが高速化を図るために#include<math.h>をいれて 2番目のループの条件式をj<sqrt(i)に変えてみたんですがうまくいきませんでした どうしたらいいんでしょうか? #include<stdio.h> int main(void) { int i,j,f; for(i=2;i<1000;i++){ f=0; for(j=2;j<i;j++){ if(i%j == 0) f=1; } if(f==0) printf("%d ",i); } return 0; }
ループで毎回sqrtなんか計算してたら遅いわな
>>569 そもそも出力結果が違ってしまうんですがどこを改善したらいいんでしょう?
2を外に出して for(j=3; j*j<=i; j+=2) { if(i%j==0) { f = 1; break; }} でいいんじゃね?
j<=sqrt(i)
>>570 うまくいかないじゃ通じないので、ちゃんとどうなったか、
出力結果が違うってならどう違うのか、他人に分かるように
書くのがマナーというか常識
一応、cygwin の gcc-3.4.4 でやってみたけど
結果に変化は無かった
#include <math.h>
#include <stdio.h>
int main(void)
{
int i,j,f;
for(i=2;i<1000;i++){
f=0;
for(j=2;j<sqrt(i);j++){
if(i%j == 0)
f=1;
}
if(f==0)
printf("%d ",i);
}
return 0;
}
>結果に変化は無かった どこかだよw
>>572 のように条件式を変えたらきちんと出力されたようです
よく考え直してみます
ありがとうございました
ちなみに出力結果が違ったというのは以下のようになっていました
言葉が足りずすいません
書き変え前
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 1
07 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 2
23 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 3
37 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 4
57 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 5
93 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 7
19 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 8
57 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 9
97
書き変え後
2 3 4 5 7 9 11 13 17 19 23 25 29 31 37 41 43 47 49 53 59 61 67 71 73 79 83 89 97
101 103 107 109 113 121 127 131 137 139 149 151 157 163 167 169 173 179 181 191
193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 289 293
307 311 313 317 331 337 347 349 353 359 361 367 373 379 383 389 397 401 409 419
421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 529 541
547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659
661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809
811 821 823 827 829 839 841 853 857 859 863 877 881 883 887 907 911 919 929 937
941 947 953 961 967 971 977 983 991 997
>>575 一々そんなの書かなくても普通はぱっとみて分かる。
573が底抜けに頭悪いだけだから気にすんな。
>>576 いえ自分も気をつけるようにします
それと最後に一つ聞きたいんですが
>>571 のようにbreak;は入れた方がいいんですかね?
一回割り切れることが分かったら、後の判定は無意味で無駄な処理だからbreakすべき。
579 :
573 :2009/11/28(土) 19:30:32
ごめん、diff で確認したつもりだったけど、同じコマンドの結果を比較してたっぽい
582 :
581 :2009/11/29(日) 00:14:33
かなり初歩的かと思いますが文字列strをno回だけ連続して表示する関数なのですが調子よくできたと思うのですが実行しますと入力した文字列が無限ループします。なぜなのでしょうか もしよろしかったらご教授ください。よろしくおねがいします。 #include<stdio.h> void put_stringn(const char str[],int no) { int i; for(i=0;i<=no;i++) printf("%s",str); } int main(void) { int y; char x[10]; printf("文字列を入力してください:");scanf("%s",x); printf("何回表示するか入力してください:");scanf("%d",y); put_stringn(x,y); putchar('\n'); return(0); }
typedef struct Memory{ T_BAR Bar; int *Gr; }T_BAR; T_BAR STRC_BAR; STRC_BAR = (T_BAR *)malloc(DoubleStr); これってどこに何の値が入るのですか。
scanf("%d",y);
ばぐってる
Cって文字列で取ったら配列に一括で代入できたか?? 一文字しか取れへんような気もするが!
そこらはコンパイラがやってくれるのか
>>587 >>585 ぐはっ初歩的過ぎてすげ-ショックorzすみませんありがとうございました。
ただでさえ&忘れるのに文字列には&つけないとかわからなくなるー
小文字を大文字に変換する関数のプログラムなんですがどのように値を返したらよいのでしょうか? returnで返すのかvoidでよいのかよくわからないです setupper(str) void setupper(char *s) { while(*s!='\0'){ if(*s>='a' && *s<='z') *s+='a'-'A'; } }
>>583 > printf("文字列を入力してください:");scanf("%s",x);
> printf("何回表示するか入力してください:");scanf("%d",y);
これって
scanf("%s",x);
だと改行文字がバッファに残るから
scanf("%d",y);
で入力できないんじゃないの?
scanf("%d",&y);にしたとしても
試してから書けよ
皆さんデバイスドライバって書いたことありますか?
ないでもない
ある
>>593 そういわれたらそうなんですがここは使わない場合を教えていただければ幸いです
>>592 returnで返すならvoidじゃだめだろ?
>>600 voidでもreturnくらいできるだろ
>>592 どうやってその関数を使用するのかをまず決めないとな。
char hoge (char abc[]) { なんたらかんたら return void; }
>>592 柴田望洋の本には、
アルファベットが連続した文字コードになっているのは、文字コード体系によっては正しくないので、
そういう前提で組むな。と書いてありますが、とりあえず
>>592 さんの作りたいのは、こんな感じでしょうか?
#include <stdio.h>
#define LEN 10
void setupper(char *s);
int main(void)
{
char str[LEN+1];
printf("英小文字と英大文字を混ぜて%d文字以内の文字列を入力してください\n",LEN);
scanf("%s", str);
puts("\n大文字に揃えるように変換します");
setupper(str);
puts(str);
return 0;
}
void setupper(char *s)
{
while(*s!='\0'){
if(*s>='a' && *s<='z')
*s -='a'-'A';
s++;
}
}
関数から値を受け取るときは、return もいいが ポインタで受けたほうがよい。 returnは1つのreturnにつき1つの値しか返せない。 実際には、例えば return A1, A2, A3, A4,......と出来るなら そのとおりにいっぱい取りたいこともよくある。
>>605 *s-='a'-'A';と増分するのを忘れてましたね
ありがとうございました
rubyだと return A1, A2, A3, A4,......ができるんだよな
でっていう
しょうがないってことで
returnは実行結果の成否を呼び出し側に知らせるためのものだろ?
ヘッダファイルに分割するメリットがよくわからないので、教えてください
分かりやすいから ヘッダは定義部分 ソースは定義したものの中身 こう区分けすれば分かりやすい だからソースファイルにあるものは必ず関数のみ インクルードファイルはヘッダ除いてなし グローバル変数もなし これがベスト
>>612 2人以上で共同開発するようになるとありがたみがわかる
>>612 フルコンパイルに5分以上かかるようになるとありがたみがわかる
一ついえるのは、 #include "FuckOSX.h" #include "FuckinMacin.h" #include "FuckJobs.h" #define FUCKINTOSH 0 int global; int main(void) { ・・・・・ とかやってるようなのはダメだということ。 この例なら、 グローバル変数まではヘッダに書く ソースに書くのはmainだけ
多人数で開発する際は、インクルードも #include <universalstudioJaponese.h> とかやってはいけない。 #ifndef __Japonese_H__ #define __Japonese_H__ #include <universalstudioJaponese.h> #endfi これでなければいけない。
619 :
デフォルトの名無しさん :2009/11/29(日) 20:01:27
sprintf および snprintf はC言語標準でしょうか?
#include <stdio.h> int add(int a, int b) { return a + b; } int main(void) { int (*func)() = add; printf("2 + 3 = %d\n", (*func)(2, 3)); return 0; } これでちゃんと動いたんですが、関数ポインタの引数の型って省略していいんですか? 低水準なところはまだよく分からないんですが、呼び出し規約とか関係したりしますか? もし省略して問題ないなら利用したいんですが……。
C言語ならなんとかしてくれる
622 :
デフォルトの名無しさん :2009/11/29(日) 20:13:12
たぶん
省略するとintとして扱われる、64bitではポインタ渡すときに問題が生じる。 32bitでも64bit整数渡すと破綻する。
624 :
デフォルトの名無しさん :2009/11/29(日) 20:17:43
念には念を入れたほうがいいんじゃない??
625 :
デフォルトの名無しさん :2009/11/29(日) 20:19:59
>>625 もしかして
C99からだったりしますか?
627 :
625 :2009/11/29(日) 20:34:27
C89からANSI標準です。
snprintfはC89からだったのか
>>623 intと同じサイズのものなら渡すことが出来るということですね。
省略時に引数の個数は問題にならないのですか?
省略しないで可変長の引数宣言使えよ
632 :
デフォルトの名無しさん :2009/11/29(日) 21:08:46
char mojiretsu[100]={0}; と書くと、最初の要素だけでなく全てがゼロクリアされるということですが、 それは規格のどの辺に書かれていますか? また、 char mojiretsu[100]={0,0,0}; と書いたらどうなるのでしょう?
char mojiretsu[100]={1,2,3}; と書いたらどうなるのでしょう?
1,2,3,0,0,0…と初期化される
>>617 なにこのガラパゴス的適応しちゃった感満点なソース。
637 :
619 :2009/11/29(日) 21:28:14
638 :
632 :2009/11/29(日) 21:29:44
もしかして標準Cではゼロクリアされませんか?
静的変数なら 0 で固定。
>>639 staticではありません。
普通のauto変数です。
初期化されなかった配列の要素は静的変数と同様に0になるってことだろ。 635のリンク先見ればわかるだろ。
キーバッファのクリアも画面のクリアも、環境依存の方法しかないよ。
クロスプラットホーと 乱離ぶらり使えよ
キーバッファのクリアって、 もしかして gets に渡すバッファのこと言ってる?
どっちにしても、そのプログラムにバッファのクリアが必要になる要素は無いよ。 gets に渡すために用意したバッファを初期化して 0 で埋めてるのも無意味。 gets は中身関係なく上書きするだけ。
ncursesつかえ
\f は殆どの場合は無効だよ。 これはプリンタに対する命令だから。 ページ送り命令な。
649 :
642 :2009/11/30(月) 00:50:02
>>643 それなら別の方法を考えたほうが良さそうですね。
>>645 ちょっと変数の名前とコメントが紛らわしかったですが、
キーバッファはbufのことではないです。
今のままだと、数字が画面に表示されているときに
先に入力ができてしまいます。
「入力してください」が表示してから、
入力を受け付けるようにしたいのです。
650 :
デフォルトの名無しさん :2009/11/30(月) 00:51:37
snprintfの無い環境で、 sprintfを使って snprintfと等価な機能をもつ自作関数を実装することは出来ませんか?
どうぞ可変長引数を使って自作してください
環境依存で良いなら rewind(stdin) が使えるかもしれない。 先行入力は本来は利点なんだけどな。
sprintfを使って実装する事は不可能ですが、 sprintfを使わないで実装する事は可能です。
できなくはないよ。
画面クリア win:system("cls") unix:system("clear")
それは正しくはないな。
657 :
650 :2009/11/30(月) 06:33:47
何やらとても難しそうですね…。 ちょっと考え直して来ます。
自作関数を↓のようにforで回した時 for(i = 0; i < 10; i++) { sum(a, b); } 関数内の変数の中身は1回ごとに初期化されますか? なんだかおかしい結果が出たんですが
初期化しているものは、一回ごとに初期化される。 但し、staticならば最初の一回だけ。
660 :
デフォルトの名無しさん :2009/11/30(月) 12:27:31
ポインタ変数とはなんですか? 具体的にお願いします。
void *p; /* pはポインタ変数 */
662 :
デフォルトの名無しさん :2009/11/30(月) 12:37:11
書式ではなくて意味を教えてもらいたいのですが・・・・
別の変数を指し示す変数
アドレス幅の符号無し整数型の変数
>>659 関数内で文字列である仮引数にH.を連結させているのですが、なぜかforした分だけ仮引数にH.が連結されてしまっています
実引数と仮引数の名前は一緒にしていますがこれは問題ないはずですよね?
ない ソースplz
>>642 バッファの件だが、環境依存しない良い方法を思いついたよ。
バッファリングはプロセス毎のものだから、入力だけを別プロセスにすればいい。
#include <stdio.h>
int main(){
char b[128];
return atoi(gets(b));
}
これをコンパイルして inp.exe としておいて、
本体のプログラム内で入力が必要になったところで
inp = system("inp");
とすればいい。
669 :
665 :2009/11/30(月) 16:00:20
670 :
デフォルトの名無しさん :2009/11/30(月) 16:06:23
普通に宣言された変数ってreturnのとき開放されてるの?
開放されてる
すみません。対称な行列を扱っているのですが、これは、 1 2 3 2 4 5 3 5 6 のように、対角線の上と下が対称になっているものです。 これを通信で送りたいのですが、当然半分にして送ろうとして c=0; for(i=0;i<N;i++) for(j=i;j<N;j++) {temp[c]=leng[i*N+j];c++;} として、上三角だけをtempにつめて送ることにしました。 このとき、受信側では、特定の要素だけを取り出したいのですが たとえば、あるプロセッサでは、leng[2*N+2]を取り出したいとすると、 tempのどこに入っているかを調べたいのです。 これは、多数のプロセッサで、またはスレッドで動作させるので なるべく計算量が少なく求めたいのですが いい方法はないでしょうか。
計算量も糞も普通に式たてればO(1)で求まるだろ それをさらに最適化したいというなら別だが
一個一個数えていくしか方法を思いつかず、O(N)になってしまいます。 どういう式になるかわからないので、教えていただきたいのですが。
>>669 よく見てないけど
strcat(tripkey, "H.");
してりゃ当然なんじゃ?
ウィンドウズとユーナイックスは文字表示のツツテムコールも全然違っている ウィソドウズint 13h アンアイクスint 80h
>>674 有名な割にはあまり役に立たない等差数列の和の公式が役に立つところじゃね?
>>677 idx = i*N+j-i*(i+1)/2
ということで、動かしてみます。
動きました。 ありがとうございました。 図を描いて考えてみたら、すぐでした……。
これさ、逆は難しいかもね。 idx=f(i,j)は簡単だけど i=g(idx) j=h(idx) ってなる関数が思いつかないや。
ねーよw
一方向性関数だっけ。暗号作成に使われるんだよね。
恐怖の暗号アルゴリズムでつね。
void f(int idx, int *i, int *j) { for(*i=0;;(*i)++) for(*j=0;*j<N-*i; (*j)++) if(idx--==0) return; } こんなんで十分じゃね?
>>685 いや、実装はできるんだが、idxを求めるみたいに
式一本でできたらきれいだなと思ったんだが。
違った void f(int idx, int *i, int *j) { for(*i=0; ; (*i)++) for(*j=*i; *j<N; (*j)++) if(idx--==0) return; } だな。
俺が個人的に許せない書き方 for() for() for() for() for() ナンボ繋げんねん
ほいで、大抵のfor地獄って 一工夫加えると1回のforで終わんねん いいかげんにせえや
iとjを求めるのに、別々の関数にしちゃうようなアホが、 式を短くすることだけにこだわった効率の悪いコードを書くんだろうなw
for(i=0, i<10;i++) for(j=0, j<10, j++) A[i] = B[j]; ↓ for(i=0, j=0; (i < 10) && (j < 10); ) if(j == 10) A[i] = B[j]; j++; else ・ ・ こんなの見たことある。
ああ 間違った !=
694 :
デフォルトの名無しさん :2009/11/30(月) 21:04:58
ダメだ。なんか頭が働いてない!!! yoisugitaka.
「ループの最中にifを入れるな」 「ifは少なくしろ」 「構造体に16個も変数入れるな それ全部short int 1つで済む」
無理矢理一行にしてみました。 idx=((i<j?(i^=j,j^=i,i^=j):i),i+j*N-((N+1)*N)/2);
ポインタでわからない所があります。 mallocをした時以外はfreeをしなくてもよいのでしょうか?
むしろ、してはいけません。
>>697 calloc
realloc
strdup
asprintf
vasprintf
など
>>698 ありがとうございます
>>699 最近Cを勉強をスターとしたのでよくわからないのですが、
int *hoge = &source;
みたいな奴以外で、動的にメモリ確保した場合だけfreeをすればおk?
701 :
デフォルトの名無しさん :2009/11/30(月) 23:14:10
char s1[40] = "ABCDEF"; char s2[40] = "GHIJKL"; void Stringcat(char *s1, const char *s2) { while ( ( *s1++ ) != '\0' ) ; s1--; while (((*s1++) = (*s2++)) != '\0') ; } 文字列連結の関数なのですが、 while (((*s1++) = (*s2++)) != '\0')//これが何故機能するのかわかりません。 最初の*s1,*s2が何故無視なれないのでしょうか??
702 :
701 :2009/11/30(月) 23:22:25
>>701 const char *p;
は、pが指している文字列の中身を変えられない。
(*pはchar型の定数)
pがどこを指すのかは変えられる。
>>701 後置きインクリメントについて勉強してくれ。
705 :
701 :2009/11/30(月) 23:54:12
コンパイラしたときのOSじゃないとその プログラムは動かないとか聞いたんだけど本当? BCC使ってるんですがXPで作ったものはvistaや7じゃだめ?64bitだと動かないのは知ってる
>>706 WindowsでビルドしたプログラムはLinuxで動かないとかそういうこと。
32bit XPでビルドしたプログラムなら、必要なものをちゃんと持ってい
けばVistaや7や64bit Windowsでも動くよ。
>>706 嘘
世の中にはクロスコンパイラという物があってたくさん使われている
コンパイルしたときのOSじゃなくてコンパイラ次第だな。 じゃないとDSとかWiiのゲームどうするんだよ。
>>708 >コンパイラしたときのOS
「コンパイルしたときにターゲットとしたOS」のことでは?
そういう意味ならそもそも質問してないと思うw
>>706 vistaで関数の動作が微妙に変わっちゃって、動かなくなったものもあるみたいだよ
>>712 675に礼を言うのが先じゃねーのか?w
>>714 そうでした・・・
お礼を忘れるなんて最低ですね・・・
>>675 あらためてご指摘ありがとうございました
そういうのを考えるのが面倒だからJAVAや .Netみたいなものが出てきたんかなあ
x09って\tでおk?
#include <stdio.h> int main(void) { printf("%s\n", 0x09 == '\t' ? "おk" : "NG"); return 0; }
質問は「x09」であって「0x09」じゃないからそれは間違ってる
コード体系に依存しないようにわざわざ \t なんてやってるのに。
嘘臭いが本当な豆知識 Windowsは64bitOSでも意外と32bitピログラムが動くものだが .NETを使って32bitOS上で組んだプログラムは 64bitOSでは動かない。 SDKにあるフラグ変更プログラムでフラグを立ててやらないと動かないのである。
724 :
712 :2009/12/01(火) 22:41:24
cygwinでコンパイル、実行していますが2バイト文字を正しく扱えないことがあるようです なんだかそのせいで正しい結果が出ていないような気がするのですが代わりになるようなものありますか?
疑うならてめえのソースを疑え
64bit窓って型のサイズどうなってるの? intは8バイト?
んなわけねえだろ
>>726 それは OS の仕様じゃなくて、コンパイラの実装の問題だから、
使ってるコンパイラ次第としか言いようがない。
コンパイルオプションで選べるんじゃね? char が signed と unsigned で選べるみたいに。
int は 16 ビットなのが一番バランスが良い。
64ビットWindows用のバイナリを作る処理系で、LLP64じゃない環境ってあるの? OSが提供するヘッダファイルと型が合ってないと、システムコールも呼べないし 実質OSで決まるのでは?
732 :
デフォルトの名無しさん :2009/12/01(火) 23:19:01
short と int と long が一部かぶってるのが気持ち悪い、と思う人と short か long かは signed と unsigned のようにどちらかの省略であるべき、と思う人といるようだが もまいらどっち?
具体的に、どのコンパイラが出したどのバイナリがどうなってると言うんだ?
>>732 どっちって聞かれても、どちらにも当てはまらないんだが。
実際は int の方が略されてるんだよな。 short int long int って。 だから int64 みたいな型名にはやたら腹が立つ。 じゃあそれは "int64 int" の略なのかよ、みたいな。
737 :
デフォルトの名無しさん :2009/12/02(水) 00:15:56
たとえば main() { return(0); } には short とも long とも書いてなく 気持ちの中ではむしろ char くらいだろ int32 main() は俺もやだ
なんで?
740 :
デフォルトの名無しさん :2009/12/02(水) 00:22:21
float main() なみに気持ち悪い
>>740 mainの戻り値ってOSへのリターンコードでしょ?floatって許されるの?
>>724 CygwinでASCII以外が扱えると思ってはいけない。
無料版のVisual StudioでC/C++を使ってください。
>>736 short/int/longが16/32/64ビットのようなintがshortともlongとも違う環境のことをどうお考えで?
>>723 x86/x64/Any CPU周りのことか?
戻り値の型を略したら暗黙でintを指定した事になる。
さっさとビット幅と呼称を統一しろよ。移植性を阻害する大きな要因なんだから。
747 :
デフォルトの名無しさん :2009/12/02(水) 00:45:06
>>741 5.1.2.2.1 Program Startup の 1 でおkとされている
>>746 <stdint.h>で我慢してください。
個人的には、このたびやっとVCにもやってくるのが嬉しい。
そんなの無くても limits.h でいいだろ。
>>724 --input-charset とか --exec-charset とかそういうのがあるはず
テキストファイルにはASCII以外は入れるなよ。 ASCII以外が入ってたら そりゃもうバイナリファイルだろ。
おまえは意味がわかってて言ってんの? いやわかってないよな? なぜそんな事を言った?
EBCDICではテキストファイルは作れないとか
指定したhwndの標準入力に送るって関数教えて
そんなものは無い hwndの持ち主のプロセス探してパイプ作って送ってやればいいかもしれないが 送られた方では関知しないであろう。もっと具体的に何がしたいのか。
標準入力はウィンドウじゃなくてプロセスが所持。 ちなみにメッセージキューはスレッドが所持。
ところで、staticのこういう使い方って変だろうか? #include <stdio.h> int fib() { static int a = 0, b = 1, t; t = a + b, a = b, b = t; return a; } int main(void) { int i; for (i = 0; i < 10; i++) { printf("%d\n", fib()); } return 0; }
だからよ int8 int16 int32 int64 こういうふうに型を決めればいいのに何でやらないのか。
っ <stdint.h>
1 バイトが 8 ビットとは限らないだろボケ
>>759 奇妙さでは、これも負けていない。
#include <stdio.h>
#define loop(v,n,b) for(v=0;v<n;v++){b}
int main(void)
{
int i;
loop(i, 20,
//for (i = 0; i < 10; i++) {
printf("%d ", i);
//}
);
return 0;
}
>760 移植性がなくなるからです 全ての環境でint64が用意できるとは限りません char <= short int <= int <= long int としておけば、少なくともcharと同じ大きさかそれ以上の大きさであれば良いので 移植性があります もしかして、int64は、64bitではないということか
だから、7ビットだの9ビットの処理系は除く。 サポートしなきゃいい。 ロシアや中国の計算機に多いが いいだろ
それなら別に型のサイズ決め打ちにすればいいんじゃね サポートしなくていいんだから
UNIX が生まれた PDP-7 は 18 ビットなんだぜ? そうなると標準は int18 になるわけだけど、それで良いのか?
組み込み系が死屍累々になりそうだ
ビット長に極端に依存するコードしか書けないヤツは Java とかに行ったほうがいいんじゃね? むいてないよ。
printf("数値を入力してください>");scanf("%d",&a); printf("演算子を入力してください>");scanf("%c",&c); ←この行のscanf printf("数値を入力してください>");scanf("%d",&b); と記述すると上記の位置のscanfがスキップされて3行目のprintfが処理されてしまいます 上記の行を最初に持って来ると問題なく動くんですが 他に解決法は有りませんでしょうか?
スキップされてないとおもうよ。
数値を入力してください>6 演算子を入力してください>数値を入力してください> になります
scanfは、改行コードを受け取るので 1発目のscanfで何か入力したあとにリターンキーを押すと 入力した文字や数字 + リターンコード と、二回に分けて受け取るために2発目のscanfにはリターンコードが入り、 「なんじゃこりゃ分からん」ってことで処理されてないように見えるだけである。 これを防ぐには、 標準入力から受けとっているなら fflush(stdin)とか挟むとよい しかし、これは規格外の使い方である。
" %c" にすれば改行とか空白を読み飛ばしてくれたと思う
gets 使えよ。便利だから。 プログラミングの勉強するのに scanf の仕様とかどうでもいい部分で躓いてたらつまらないだろ。
fflush(stdin)で入力バッファがクリアされる処理系があるんだ Windows?
?
>>775 gets() でとてつもない長い一行を入力されたあかつきには、バッファオーバーランがまって降ります。
scanf() の安全パターンか、fgets() を使うべき、って大昔から散々いわれているのですけれどもね。
gets()使ってる所でオーバーフロー起こしたら、それは オーバーフロー起こした使用者が悪い
scanfって、マイクロソフトの _s 系以外 「引数として」サイズ指定出来るもんないんだっけ?
>>781 使用者のせいにするのでは、あなたには成長、進歩などの言葉は無縁でしょうね。
1Gバイトぐらいのバッファ確保しとけば
子供か
ちょっとした練習のためのプログラムにバッファオーバーもくそもあるかよ。 お前は雑誌のサンプルプログラムに、 いちいち、戻り値のチェックしてないだの文句付けるのか?
スクリプト言語使えよ。便利だから。 プログラミングの勉強するのに バッファオーバーフローどうでもいい部分で躓いてたらつまらないだろ。
はいはい Ruby は最高 Ruby は最高
>>787 そんな甘い考えでは、大事な本番でしくりますよね。
>>787 当然文句付ける。それが悪習慣になって他のプログラマに迷惑掛けるからな。
gets()じゃ数値を入力するときに一々変換しなきゃいけないから、 scanf()より初心者に向いてるとは言いがたい。
>>787 「ちょっとした練習」なら個人で、ここ以外で好きにすればいい。
ポイントは、入門者が悪習を身に付けないように気を配ろう、というだけの事なんだが?
なにを言っても無駄
本人には、無駄かもな。 これから勉強しようという者には参考になる。
そもそも「キーボード」から入力したいなら conio 使えよ。 出力もな。
>>792 つかscanf()のほうこそ挙動が独特で、初心者がはまってるだろ。
scanf()は使いこなせばいいって言うやついるけど、時間かけて
挙動を理解しても、本番じゃまず使わないし、最初からfgets()使ったほうが
なんぼかいい。
798 :
デフォルトの名無しさん :2009/12/02(水) 23:08:46
読み方は「コニオ」で合ってる?
音声言語ではないから「読み」などというものは存在しない。 conio は、ただ conio なのである。
俺はコンアイオーって読んでる
俺はコニオだな。
802 :
デフォルトの名無しさん :2009/12/02(水) 23:44:21
くにお
>>784 はいはいそう思ってて下さい
俺は宿題程度にはgets()で十分だと思っている
業務用のプログラムには絶対使わないが
要するにケースバイケースという事だ
そんな事も分からないお前こそ進歩がないな
fgets()使えばいいじゃん。 少しタイプ量が増えるくらいだし。
> 業務用のプログラムには絶対使わないが > 要するにケースバイケースという事だ 練習サボる奴ほど「本番ではすごいんだぜ」って言うんだよな。
>>806 うるせーないちいち
そんな事は言われなくてもわかってんだよ
それでも敢えてgets()を使うんだよ
入門者の邪魔だな。
馬鹿に何を言っても無駄
>>807 その練習する部分と関係ないとこでムキになっても仕方ないだろ。
単にバットの素振りするだけなのに
バッターボックスの中じゃないと振らないやいとか駄々こねるのか?
初心者や不特定の人間にgetsを教えるな、って事だろ 危険性も一緒に教えるならいいが、直でソースに組み込みかねない
こういうのに限って、俺の例えはわかりやすい、と自賛してそう
必死すぎるw
ほんと、必死こいてgetsを使うキチガイって何なの?
どうせfgets()しか使わなくなるんだから、最初からfgets()だけを学べばいいじゃない。 scanf()とか覚えても無駄だよ。
*scanf()を使わずに、fgets()を使って PGM Format(MIME:image/x-portable-greymap)のヘッダを解析するプログラムを書いてみてください
いいえ
MSのソケットの例プログラムですらちゃんとしてたぜ?
strstr関数使ったら問題が発生しましたってエラーが出るんだが 意味わからん
俺にもわからん
第一引数はchar*第二はchar配列の変数戻り値は取得してない
どうせstrstr()じゃなくて、別のところがバグってんだろw
+=と=+ ってどう違うの?
>>826 給与 += 10000;
給与 = +10000;
全然違う!
+=は一つにまとめて独自の意味があるが、=+は=と+が並んでるだけ。
>>827 その2つの例えは私にとって同じことを示しているように思うのですが
私はどこで間違ったのでしょうか?
>>829 上は追加で、下は上書きだ。
10000 と +10000 は同じだぞ
a+=10; は a = a + 10; a=+10; は a = 10; どこが同じに見えるんだかw
その昔、a =+ 10 と書いて a += 10 と同じように解釈したコンパイラがあったそうな。
'\0' だろ。
この場合の\は円の意味だろ
バックスラッシュが?
無給ということだろうけど、無職ではない
共に未初期化として unsigned 給与; なら 給与 =+10000; は夢がないし int 給与; に 給与 += 10000; されたら人生掛ける感じだな
>>805 最近の宿題の条件をみると、fgets() 使え、というのがわりに多いのですが。
それにgets() の気持ち悪さを理解できないようではセンスがない。
まだ続けるのか。 自分しか入力しないようなものに ガチガチのセキュリティなんか組み込んでも意味無いだろ。
Javaでいうところのdepilated(推奨されない)な関数なんじゃね?
>>840 fgets使ったところで、たいして手間は増えないだろ。
20年以上前から、すでにfgets推奨が定石だったのに、なぜgetsにそこまでこだわるのか。
他人が口出すのがおかしい
他人に教えるときはgetsにするなというだけでしょうに
depricatedじゃなくて deprecatedね rも抜けてたけど
>>832 古い HP-C で泣いた覚えがw
しかも "= +" と書くと、警告出るんだよ。
「"+" は要らんやろ。足したいなら空白をあけず "=+" と書けや。」
>>846 rが抜けてたどころか、いらんlが入ってるし、cも抜けてるじゃねーかw
やりとりを見ていて気がついたのは、 「スレの趣旨から言って、入門者も見ることを意識している者」と 何故か「自分の好みに口出しをされていると思い込んでいる者」との違い。 まあ、このスレに限った事じゃないが。
いや、バカの一つ覚えを毎回書くやつにうんざりしてるんだろw
バカの一つ覚え(笑) 基本的なことなのにね(爆)
それくらいしか言うことできないから得意になって指摘してるんだよな。
まだ言ってる(笑)
>>853 このスレで荒らしの出番はありません
お引取りを
俺は荒らしじゃないよ。バカ
gets() 薦める奴はセンスがない、ってことで。
スルースキル検定が必要な日がやってこようとは!
さすがハイセンス(笑)なやつは一味も二味も違うなw
>>849 多分違う。
後者はgetsでいいよ派を指していると思うが、彼等の言い分はこうだ。
「初心者にfgetsなんて難しいものを進めるのはおかしい。」
ああ、誤字とかないわ俺
ずっと考えてるんですがわからないんで誰か教えてください・・・ mallocで動的に多次元配列を作りたくて以下の関数で、 int malloc_3dim(int ****array3, int row, int column, int oku) { int i,j,k; *array3 = (int***)malloc(sizeof(int**)*row); for(i=0; i<row; i++){ *(*array3 + i) = (int**)malloc(sizeof(int*)*column); for(j=0; j<column; j++){ *(*(*array3 + i) + j) = (int*)malloc(sizeof(int)*oku); for(k=0; k<oku; k++){ array3[i][j][k] = 0; printf("array3[%d][%d][%d] = %d\n",i,j,k,array3[i][j][k]); } } } return 1; }
tabキー使ってたら誤爆しました、すみませんorz mallocで動的に多次元配列を作りたくて以下の関数で作成することはできわしたんですが、 コメントの部分を有効にするとj=0回目のループでは配列にすべて0が入るのに j=1回目のループになると配列に0が代入されずアクセス違反になります。 この関数で作成した配列には、main関数内で値を与えるので別にコメントの部分は 必要ないのですが、どうしてアクセス違反になるのか自分ではよくわかりません。 わかる方がいたらご教示お願いします。 int malloc_3dim(int ****array3, int row, int column, int oku) { int i,j,k; *array3 = (int***)malloc(sizeof(int**)*row); for(i=0; i<row; i++){ *(*array3 + i) = (int**)malloc(sizeof(int*)*column); for(j=0; j<column; j++){ *(*(*array3 + i) + j) = (int*)malloc(sizeof(int)*oku); // for(k=0; k<oku; k++){ // array3[i][j][k] = 0; // printf("array3[%d][%d][%d] = %d\n",i,j,k,array3[i][j][k]); } } } return 1; }
よくわからんけど、 (*array3)[i][j][k] じゃないの?
mallocが多いな 1回で全て確保しちゃいなよ
>>862 malloc の戻り値チェックしてない。
再提出。
864で答え出てるのに、どうでもいいとこ穿り返すアホはなんなんだ
二次元以上の配列を使用する場合は非malloc領域にそれを置くのが 賢明。ただし一般にサイズがでかいのでグローバル変数に するのが普通。
二次元配列に戻ってみれば自力でわかる わからなければ一次元で どうしてそういうのは実験しないかなあ
理解しにくければ無理に引数で渡さないで、戻り値で返せばいいのに。
>>863 のような直方体を充填するような多次元配列なら
int* data = (int*)malloc(sizeof(int)*row*column*oku);
data[i*column*oku + j*oku + k];
みたいに一次元配列で代用したほうが簡単じゃね?
キャストすんなうぜえ
残念ながら世の中はそうそう勝手に決められないんだよな それが。猿段階で思いつくようなことを得意になってア ドバイスされるとエラくムカつくことがあるな。
予め○○は変更できませんとか条件を提示して質問すればいいだけのことだろ 猿じゃければ簡単なはず
変なところで改行されてると縦読みを探してしまう
電子メールでプロポーショナルフォント使って横幅を揃えようとするやつってなんなの? 受信者が同じフォントとは限らないって教えてやったほうがいいのか? 変なところで改行されてて、読みにくいったらないんだけど。 一部を引用しようとすると余分な文字がくっついてくるし。
メール本文をビットマップ画像オヌヌメ
>>873 猿みたいな質問してるんだから最後まで土下座しろよな
・試さない ・調べない ・何を知りたいのか口を割らない ・偉そうにされたくない
873は元の質問者とは何の関係もない、だたの猿だろw
アイちゃんより低能な猿さん乙
何でも試せるんだと考える。 何でも調べればわかるんだと思う 何を知りたいのかがわかるのが当たり前だと思う 偉そうにしたい 裏返しただけだが...
改行と折り返しはちゃんと区別しろよな。 折り返しをするのはあくまでビュワの仕事だろ。変なとこで改行文字を入れて折り返し擬きをするんじゃねえよぼけ。 読む人が自分と同じビュワ使ってるとか思ってんじゃねえよカス。
なんで配列へのポインタ参照には&つけないといけないの? アドレス値は同じだろ?
アドレス値は同じとは限らないし &を付けなければならないとも限らない
>>860 gets() 薦めるくらいなら、限定して *scanf() 薦めたほうがまだましかと。
あったかいよ
電気あんかー
ポインタだよ。
>>886 *scanf?scanf以外は難しいから薦めないに決まってる。
お前はそれでいい
>>886 ちゃんと
(*scanf)( );
こういうふうに括弧付けて書かないと駄目だろ。
*scanf( ); だと
*(scanf( )); になるぞ。
この場合の*はワイルドカードじゃなかろうか
ネマレ
理解した上でのレスであろう
理解してるようには見えませんw
>>883 電子メールは、80文字くらいで改行入れるって昔からのしきたりだろ。
subject に日本語使っても文句言わないで
日本語自体が問題というわけではないでしょうに
文字配列の一部を上書きしたいんだけど 上書きするための文字列のバイト長が異なるからmemcpyが使えない なんかいい関数無いの?
>一部を上書き するんだから >文字列のバイト長が異なる のは当たり前じゃね?
えっ?
一部を上書きするだけなら、memcpyのサイズを上書きする文字列のサイズにすればいいだけじゃ?
>>901 の日本語がひどすぎる件。
まず日本語の勉強から始めろよ。
うるせー。 解答できないなら書き込むんじゃねーよ。 二度と来るな。ザマァwww
すみませんVisual C++で以下のプログラムをデバッグしました。 #include<stdio.h> int main(void){ printf( "\x1b[0;36m" ); printf( "abc\n" ); } 実行結果は水色の字で abc と表示されると思ったのですが 実際は [0;36mabc と表示されます。 C++ではprintf("\x1b〜 で操作ができないんでしょうか?
できます。
>>908 C++ だからではなくて、端末の問題。 cmd ではダメ。command.com ではどうですか?
>>908 古い手段で現在のWindowsの流儀に沿っていない。ANSI.SYSという
DOSの頃からあった標準添付ドライバをconfig.sysに設定しC:¥に置くとかそんなやり方で対応できたっけな Windows 2000の頃までなら
XP以降でそれで出来るかどうかは知らない。
システムフォルダーにANSI.SYSを検索して無ければそのやり方
(エスケープシーケンス)出来ないと思ったほうがいい。
>>908 やらないほうがいい
VC++はWindows専用の
GUIアプリを作るもので、
コンソールアプリには
適していない。
>>900 だが Outlook Ekusopress のエンコードには問題ががが
>>901 バイト長が異なるなら、それは上書きと呼べるのかどうか…
"ABCDxxxEFG" → "ABCDyyyyyEFG" なら、
1. "EFG" を memmove で移動。
2. "xxx" の先頭から "yyyyy" を memcpy で書き換え。
915 :
910 :2009/12/05(土) 14:32:20
>>914 できないものはできないのですけれども。
916 :
908 :2009/12/05(土) 14:47:09
みなさん、ありがとうございます。 プログラミングは様々な事を考慮しないといけないので難しいですね… 今回は飛ばして次の事を勉強してから、また文字の色を変えたくなった時に改めて調べてみます。
917 :
デフォルトの名無しさん :2009/12/05(土) 15:04:23
C言語でJPEGなどの画像をテキストと一緒に表示させるにはどのようなプログラムを組んだらいいですか? プラグインは使わない方向で教えていただけませんか?
Unix系かWindowsかで変わる まぁ、レイヤーとなるライブラリを挟めばクロスプラットフォームなプログラムを作ることはできる Qt, wxWidgets, SDLなど
>>915 コンパイラの問題ではないし、そもそも C の範疇ですらない。
Windows のコンソールウィンドウを使う以上、ANSI エスケープシーケンスが
使えると思うほうが間違っている。
920 :
912 :2009/12/05(土) 15:29:44
>>919 間違いとまでは言わないが、Webブラウザが軽く起動出来た上
手軽にアプリに内蔵できるOSで、ソーメン流しみたいに
コンソールに出力させる開発方法はレガシーだろな。
>>917 って標準以外のライブラリのことをプラグインと言っている気がするなぁ。
気のせいだといいんだけど。
922 :
デフォルトの名無しさん :2009/12/05(土) 16:06:34
C#と同等のことを何とかC言語で使うことができないだろうか
フロントエンド
925 :
デフォルトの名無しさん :2009/12/05(土) 18:18:48
ちょっと質問というか,最近の開発動向を聞きたいのですが winコンソールアプリってwmain等,wchar_tに対応してるじゃないですか それで最近はもうunicodeに対応してるのが当たり前で これからは全部unicodeでやりましょうねって風潮があると思うんですけど クロスプラットフォーム環境で開発しようと思うと unixとかlinuxだとunistd.hとかの環境標準関数群がwcharに対応してなくて いちいち変換するのが二度手間なんですけどそれでも対応した方がいいんでしょうか unicodeで統一するよりもマルチバイトを基本に必要なときだけwchar_tにした方が スマートな気がするのですが、世の中はどうしてunicodeで統一する流れになっているのでしょうか?
>>925 TCHAR でも使っておけばいいんじゃない?
927 :
デフォルトの名無しさん :2009/12/05(土) 18:39:16
sprintf(buffer, "%f", 1.234); これでbufferに出力する小数の桁数を調整するには どうすればよいですか?
誤解してるみたいだが Unicode ←対義→ マルチバイト じゃないからな。 ワイド ←対義→ マルチバイト だからな。 Unicode はマルチバイトもワイドもどちらもある。 UTF8 はマルチバイトだし、UTF16 はワイド。
うーむということは
例えばgetoptとかを使う場合
使う前にTCHARがwchar_tだったら変換する
っていう処理を入れるってことですかね
他に例えば
char test[128];
strcat(test,argv[0]);
だったのをunicodeに対応するとwcscatを使ってたのですが
TCHARを使おうと思うとTCHAR型に対応した関数を自分で作る必要があるってことでしょうか
それでその関数内でTCHARがどっちか判別してstrなのかwcsなのか使い分けるって感じなんでしょうか
自分は趣味のアマグラマなんですけど
プロの人はこうやって書いてるんでしょうか
>>929 すみませんそのへんはごっちゃになってました
TCHAR は Win9X 系と WinNT 系でソースを共有するためのものだろ。 もう今となっては使う意味は無いよ。
>>931 95系とNT系が混在してた時期でも、ほとんど機能してなかっただろうしな > TCHAR
てことはwchar_tで書いてwchar_tに対応してない関数を使う時だけcharに変換する もしくはwcharに対応したラッパ関数を自分で書く っていうのがスタンダードなんですね,ありがとうございます. チラ裏ですが今書いてる物に限れば,非専門の人でも読めるようにしたくて そのうえでwchar_tくらいはいいだろうと思っていたのですが wchar_tの変換やラッパ関数が増えると混乱させそうなので 全部charで書き直したいと思います といった経緯でwchar_tに対応しないシステムが作られ続けるんですね・・・
>>934 TCHAR系はただのマクロ
__UNICODE__ の有無で
関数を置き換えてくれるよ
今問題にしてるのは呼び出される時じゃなくて呼び出す時で それで呼び出し対象関数がだぶちゃに対応してないってことだろ それならTCHARでの対応は無理じゃね?
TCHARはtypedefされてるから ちゃんと書き直さないと型判定エラー出るから置き換えてはくれない記憶が
> プロの人はこうやって書いてるんでしょうか 基本的に全部charかな。 wchar_tとかほとんど使わない。
>>925 >unixとかlinuxだとunistd.hとかの環境標準関数群がwcharに対応してなくて
wchar_t がない…だと?
捨ててしまえ、そんなゴミ環境。
941 :
デフォルトの名無しさん :2009/12/05(土) 20:16:06
え?そらだって、普通UTF-8使ってるからだろ。 システムコールでwcharに対応する必要ってあんまり無いじゃん。 wchar_tという型の定義自体が無い訳は無いと思うよ。
>>940 VC++も対応してないぞ。ファイル入出力。
STLでも対応してないぞ。fstreamのwstring版はない。
根本的な問題なんだろ。linuxのせいではなく C標準化団体がwchar_tのファイル入出力を規定しないから いつまでたっても、charでやることになる。 環境依存してしまう辛菜。
>>942 fstream系でconst wchar_t*でファイル名の引数を受け取るやつはVC++独自で存在するぞ。
それがなかったとしても、HANDLEで入出力するようなストリームバッファ・ストリームクラスの派生を作るという手もあるし。
長いパスが扱えない以外に問題は出ない気がするがな。 実際にwindowsのフォルダ名、ファイル名は、CP932 = SJISだが 使っていて不具合でないだろ。 長いパスさえ、linuxで動作可能な標準のCで扱う方法もある。 カレントディレクトリを、260文字以内ずつ移動していって、ファイル元にたどり着いてから作業すればいい。
>>944 それつかう位なら、windows.hで使えるCreateFileをつかうだろ。意味なし。他のコンパイラで動かないし
>>944 独自でなくて、標準関数が両方を受け付けるっていう意味だったんだ。
>>945 > 実際にwindowsのフォルダ名、ファイル名は、CP932 = SJISだが
それは違う。Windows 95/NTのLFNなFATのときからUnicodeだった。
(Win9xのAPIではマルチバイト文字でしか扱えなかったけど)
確かにunicodeの制御文字列使ったウィルスとか地味に流行ったな
内部の処理がUTF16LEなだけでは。UTF16LEのファイル名を出力するとバグった気がする。
CreateFileW使っても、実際に保存するにはCP932にしている気がするし windowsでファイル名の文字コードを変換するにはどうすればいい
>>951 ファイル名にunicodeにしかない文字使えるし、unicodeなんじゃね?
>圧縮ツールは一般的にファイル名を Shift_JIS(CodePage 932)で保存を行います。 これはwindowsじゃなくてツールが一般にunicodeに対応してないってことじゃね
unicodeじゃなかったら、おれのPCのデスクトップにある €.txt てファイルはどうなってるんだ。
どうやら標準はunicodeだが、地域と言語オプションで各国に特化できるようだ。 日本で標準設定で使うとCP932になって、それ以外だとunicode表示らしい。
958 :
955 :2009/12/05(土) 21:33:36
俺のPCのwindowsも日本語版で、とくになにもいじってないけどunicodeにしかない文字が使えてるよ?
ファイル名に ASCII 以外を使うんじゃねーよ
大部分はCP932で保持されてるけど、不可能な部分だけUTF16なんだろ。
>>957 それはシステム標準のロケールをどこにするかって話じゃね?
それによってunicode未対応のプログラムの挙動が変わるだけでファイル名はunicodeでは
unicodeとCP932混在している場合に、char型関数だけ使って不具合が出なければ charだけを使うことが出来る。
実際に、CP932、UTF16の文字コードが確定しているファイルを FTPにでも上げて貰えるとわかりやすいのだが。
966 :
955 :2009/12/05(土) 21:39:27
>>960 そんなややこしいことはしないんじゃね?
winapiでは自動で変換している可能性あるからな。どうすれば確定したファイル名ができるんだ。
ググッてみたが FAT32:sjis NTFS:Unicode だって ただunicodeに対応してないプログラムで ファイル名を取得してファイル名を変えるとかすると 強制的にsjisになっちゃうってさ だけどファイル名操作でunicodeに対応したwin32apiってあるっけ?
>>968 > 強制的にsjisになっちゃうってさ
SJISの範囲の文字しか使えないってことで、ファイル名にSJISが使われるってことじゃないだろ。
970 :
968 :2009/12/05(土) 21:46:28
>>969 あぁごめんその通りです、日本語が意味不明でした
てかここの住人相手に言及する内容じゃなかったな
いや違うだろ
> だけどファイル名操作でunicodeに対応したwin32apiってあるっけ? W付のapiってそうじゃないの? A付のAPIも内部でワイド文字に変換されるって話だし。
winapi が勝手にUTF16に変換しているのが正しいようだ。
インターネット上で「Windows のファイル名の文字コードは SJIS が使用される」
という情報が散見されますが、正確には、Windows2000, WindowsXP などの
NT 系 Windows カーネルでは、Windows カーネル内部では、
ファイル名は全て Unicode で扱われており、状況によって SJIS への変換が行われます。
具体的には、次のような動作になります。
(1) Windows カーネル内部では Unicode を使用
(2) NTFS ファイルシステムに保存する際は Unicode を使用
(3) CIFS プロトコルによるファイル転送の際は Unicode を使用
(5) Windows 上で稼動するアプリケーションには、Windows カーネルが SJIS に変換して渡す
http://www-06.ibm.com/jp/domino01/mkt/cnpages7.nsf/page/default-007ACA9B
A 付きの API は W 付きのラッパなんだろうね。
ということは、char型関数だけでは、全ファイルへのアクセスは不可能って事だな。 これはマルチプラットフォームのソースコードを書く上で困ったことになるな。 fopenなどファイル操作をする部分は、そのまま使えず linix windowsごとにラッパーするしかないな。
windows linuxで動作されるにはどうすればいい。 linuxに合わせるにはラッパーは、UTF8を出力するようにしないと駄目か。 wchar_t型は、linuxの標準関数にないからな。 char utf8で入出力すると、fopenなども独自に書き換えないといけなくなり大作業になるな。
%4F みたいな表記使えばいけるんじゃね?
wchar_tを標準にして、linuxの方だけアクセスするときに、EUC UTF8に変換するのが楽か。
俺詳しくないけどlinuxのC標準入出力関数はwchar_t対応してるんじゃね? 対応してないのはgetoptだとかgetenvとかのC標準じゃなくて環境標準関数だけで いまいち話分からずに横レスですまんが
内部コードはDBに合わせたコードで。 入出力で必要があれば変換。
>>981 wprintfとかfgetwsとかはあるけど、残念ながらfopenのwchar_t版はないの。POSIXにも標準Cにも。
windowsのwchar_t関数の類似品を作るのが一番手間が掛からないな。
getenvはc標準でmsvc限定なら_wgetenvがある
たしかgetoptはc標準じゃ無いよな、しかるに_wgetoptも無いと思われ
>>983 msvcには_wfopenってのがあるよ
うちのgccにもあるが、標準じゃないならディストリに依存するかな?
一応クロスプラットフォームで動作できると考えていいと思うが
>>985 _getevnも_wfopenもVCというかWindowsくらいにしかないから、今話題にしているんでしょ。
全ディレクトリ探ったが、wfopen無かったぞ。 mingwではないのかよ。
wchar_tを標準にするのは、決定として、これをfopenにわたすときはどうすればいいの? EUCかUTF8に変換しないといけないけど。 もともとのコードと、linixの内部コードの両方が判明して、それをコンバートする必要あるけど。
あぁすまん、うちの環境が不思議環境だっただけだ、ほんと申し訳ない
その内部の変換はどうすればいいのかわからないですが?
992 :
デフォルトの名無しさん :2009/12/05(土) 22:42:22
次スレたててくる。
✿ ✿梅✿ . ✿✿
wopendirがwindowsにもlinuxにもない・・・ mingwとbccにはなぜか入ってる。 linuxにないのが絶望的にまずい。 charで取ってきて、コンパイラ毎に対応するwchar_tにかえていくしかないか。
マルチプラットフォームは諦めて、linuxはchar windowsはwchar_tでアクセスするのが良いか。
誰かマルチプラットフォームを謳っているSDLのソースの 入出力がどうなってるか調べてレポートしてくれ
勝手に自作関数用意すれば、いろいろ出来るけど既存の関数に合わせるのが良いんです。 一方は、全く変更無しで通るようにする。
あ、1000もらいますね。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。