1 :
デフォルトの名無しさん :
2013/01/16(水) 04:41:24.65
2 :
デフォルトの名無しさん :2013/01/16(水) 05:39:44.25
< `∀´>ニダー
thunder
今時, K&R のソースを優しく通してくれるコンパイラってある?
7 :
16 :2013/01/16(水) 18:49:56.04
あ, 書き忘れてた. おそらく Unix-V7 の頃のコードです
純粋なK&Rのみであれば通るだろ
int main(argc, argv) int argc; char *argv[]; { 〜 return 0; } みたいなやつならうちのコンパイラでも通してくれた。
10 :
16 :2013/01/16(水) 19:06:07.85
>>9 どっちかって言うとキャスト方向
いろいろ, 大変なことになってるw
11 :
デフォルトの名無しさん :2013/01/16(水) 21:24:08.23
初心者からの質問です。 ―>という記号なんですがよく分かりません。 検索しても出でこないのです。 どなたかこの記号の意味を教えていただきませんか?
>>11 struct SampleStruct {
int a;
char b;
};
struct SampleStruct *pss;
pss = malloc(sizeof(SampleStruct));
pss->a = 0;
pss->b = 'A';
>>13 2点ほど突っ込みどころがあるが、
コンパイルできるか?
a->b は (*a).b のシンタックスシュガー
VisualStudioでC言語扱えるの? USBドライバを作る、とかいう話が来てるんだけど ドライバ扱ったことないから戸惑ってる ちなみに家にはVS2008だけがあるのだが、これ流用できない? 寝かしとくのがもったいなくて
C、C++、C#、VB.Netが使える おとなしく2012使えよ
USBドライバを作るならDDK買わなければいけないんじゃないの?
int main(int o, int p){ int sex = 0721; int orz=3; int OTL=3; (o^p^o); }
>>18 サンクス
>>19 WDKのことか?ググッたら出てきたんだが Windows Driver Kit
ああねむい…
win32のテトリス、1時間で作りましたに騙されてる系? usbドライバ作りますの君(きみ)は
いまどき系とか
署名問題もあるからMS-WindowsだとWinUSBを叩くのがよさげ
試しにpingしてみろ 先月から1472バイトまでしか受け付けない現象が起きてるから 原因は俺には大体見当がついたが・・・ 管理人の技量が足りなそうで復旧できないかもね
IPヘッダが20バイトでICMPヘッダは8バイトだから、MTUが1500バイトなら1472バイトまでしか通らない。
29 :
859 :2013/01/18(金) 15:58:49.53
$gcc -ansi でコンパイルすると全角文字がある時に example.c:x: error: stray ‘\343’ in program example.c:x: error: stray ‘\200’ in program example.c:x: error: stray ‘\200’ in program の様なエラーが出るのですが、この時の 343, 200 の様な番号が何の番号なのか知りたいのですが 何かの文字コードの番号なのでしょうか?
8進数なので、343 200 200 = E3 80 80 = UTF-8の全角スペース だな。
31 :
デフォルトの名無しさん :2013/01/19(土) 15:41:12.06
中学の時に番長と呼ばれてた
32 :
29 :2013/01/19(土) 16:41:05.95
>>30 今にして思えば全角スペース1つで3行のエラーが出ているのに
3行合わせて1つの文字という認識ができなかったのが悔しいです。
Esc キーを ‘\033′ の様に書いていたりもしたのに。
UTF-8 では日本語は 3 バイトという話も頭の中で繋がりました。
本当にありがとうございました。
33 :
デフォルトの名無しさん :2013/01/20(日) 09:45:13.58
いえいえ
34 :
29 :2013/01/20(日) 11:15:28.67
何度お礼を言っても言い足りません。 本当にありがとうございました。
35 :
デフォルトの名無しさん :2013/01/20(日) 14:25:23.50
しつこいな
GCCのtypeofに相当する機能って最近の規格に盛り込まれてる?
37 :
デフォルトの名無しさん :2013/01/20(日) 18:49:19.78
遺伝的アルゴリズムの多点交叉(2点交叉など)について知りたいのですが、 プログラム例などを交えて解説されているサイトってありますか??
ポインタとかクラスを実用例とかで解説してくれているサイトとかってありますか?
webkitを使ってみたいのですが、どうすればいいですか?
Google Chromeをインストールして起動すればよい
>>38 Cにはクラスはないんだが。
>>37 C言語スレで聞く内容じゃないことは確かだ。
クラスを実用的に使う方法みたいな、プログラミングの技術ではなく 方法論的なものを論じた書籍はほとんどない。残念ながらこれが現実。
構造体に関数ポインタでクラス
デカルト、カント、ショーペンハウエルで半年くらす
char *p="hoge"; と記述したら、ポインタ理解できてる? とドヤ顔で指摘されちゃった。
const char *p = "foo bar baz";
ざわ…ざわ…
int* p=0;while(1){*p=0;p++;} これ実行したらどうなるの?
実行してみろよ
sizeof(main) が 1 なんですけど、どうしてでしょうか。
54 :
52 :2013/01/23(水) 17:12:33.93
>>53 そうなんですか。回答ありがとうございます
>>50 x86環境なら *p = 0を実行した時点でセグメンテーションフォルト。
57 :
デフォルトの名無しさん :2013/01/23(水) 23:50:46.92
datファイルから文字を読み込み表示すると最後の文字だけ@マークが表示されるんですが なんでかわかりますか?
58 :
デフォルトの名無しさん :2013/01/24(木) 00:00:36.71
知るかボケ何だよdatファイルって
そーゆーフォーマットのデータだから
構造体を、例えば struct node{ char str[10]; int a; } x; みたいに定義したら、xの構造体に含まれるstr[10]の先頭のアドレスを 取り出すにはどうすればいいのでしょうか。 &(x.str[0])かな〜とか思ったんですが、うまくいかなくて・・・
>>60 &(x.str[0])
で問題ないけど、、どんなコードで失敗するの?
&(x.str[0]); x.str どちらでも同じ意味だね。
char *p; p=x.str;
>>60 ひょっとして、構造体に定義したメンバが常に定義した通りに並ぶと思ってる?
> うまくいかなくて・・・ こういう質問に答えるのは無駄。スレ汚しにしかならない。
67 :
デフォルトの名無しさん :2013/01/24(木) 11:03:29.61
そう?
・上手くいかない実例が書かれてない
・ホントはやり方を手早く教えてほしいだけ
・ヴァカどもの教えたい優越感やらコンプレックスを刺激して答えだけ引き出してる
つまりは
>>60 なんかに答える奴は低能無能のアホ
chromeでググッた後戻るボタンでgoogleの画面に戻ると 入力した検索キーワードが消えてイラつくんですが どうしたらいいですか
ソースを書き換えてビルドし直して下さい
Openソースだし自分でなんとかしろ
ブラウザ側じゃ無いんじゃね? webhpのリダイレクト行程でなんかワルサしてる感じ
73 :
デフォルトの名無しさん :2013/01/25(金) 15:41:25.21
3行×2列の整数型の2次元配列matrix_dataに関して、 matrix_data[2][0] は、matrix_data[0][0]を1番目の要素とすると、計算機のメモリ上では、何番目の要素となるか数字で答えよ。
CとC++はどっちが大規模開発に向いてますか?
マルチなんて微罪に思える程に73は知性と人間性に問題があるな
C言語を書く人の定番のIDEってありませんか? VC++ありますけどC言語の補完がでないのできついんです
C#のListみたいに動的に配列の追加・削除はできないの?
C#のListみたいのがCで実装されてんだよ
Cの場合は自前でリンクリストを設計するところからだね。
自己参照構造体を使って自前でlistを作成するのが Cプログラマの正しい生き方
/* 自己参照 */ struct ZZ { int val; struct ZZ *pNext; }; struct ZZ root, next; root.pNext = &next; next.pNext = &root;
C使いならエディタやIDE位自分で開発しろ
動的配列を置く場所をスタック上にこだわった場合 ちょっと無理があるね
スタックの伸びる方向と添字の伸びる方向が逆だからなぁ
そんなあなたにPA-RISC
unix使いはスタックが無限だと思ってるふしがあるから嫌いだ。
本当に書いてあったw
>>90 Unix 関係なしで, 大量にメモリー積んだHPC環境に慣れたやつとかだと,
32bit機で平気でこんな事しようとするぞ
double x[1000][1000][1000];
double y[1000][1000][1000];
double z[1000][1000][1000];
foo() {
int i, j, k;
for (i = 0; i < 1000; ++i)
for (j = 0; i < 1000; ++j)
for (k = 0; k < 1000; ++k)
メインメモリを超えるサイズのデータ扱うのに、意図的にdiskにマップぐらいするだろ。
スタックの話してる時に静的変数を持ち出す93
えっ
初心者によくあるのはそのx,y,zみたいな変数を深いネストで呼ばれる各関数で 一時変数として自動変数で宣言しているようなもの
99 :
デフォルトの名無しさん :2013/01/28(月) 19:45:35.74
何度かここでGAについて質問させてもらっているものです
160bitの2進数の列から特定の5bitの2進数を先頭から探索していき,
目的の5bitの列があれば得点を加算していき,それが個体の適応度となる
というGAを作成しているのですが,200世代くらいみても個体の平均適応度が,
全然上昇していきません 10世代目くらいまではグッと上昇するのですが…
遺伝的アルゴリズムってこんなものなんでしょうか…??
以下作成したプログラムです
http://codepad.org/DVr8i5zv
初期収束でググれ
evaluationがおかしくないかい?
intは32bitなのに、160bit格納しようとしてるところが...
char s[1]; scanf("%s",&s); printf("%s",s); これ1文字までしか受け取れないと思ってたけどなん文字でも受け取って表示できるのはなぜですか? あとこんな風になん文字入力されるか分からない時ってどんな風に書けば良いのですか?
>>103 それメモリぶっ壊してるから
超危険だから
105 :
デフォルトの名無しさん :2013/01/29(火) 00:29:34.80
最大フィールド幅を使うとかfgetsとかだっけ?しばらくC使ってないから忘れてしまった メモリぶっこわしてるのは受け取ってるとは言えないだろうな
scanfで幅を指定して受け取るか
fgetsで幅を指定して受け取るかだな
scanfでも最大フィールド幅指定は可能
最大幅が決まって欲しくない場合は、
最大幅を指定しつつ、終わりが見えなければ次を読み込んで後で連結・・・とかだな
>>106 getsは最悪な関数なので使用禁止
getcharでちまちまやるのは正直どうかと
ちまちまやるのもいいんじゃないの、最初の頃は
109 :
デフォルトの名無しさん :2013/01/29(火) 00:46:52.71
使えない物を覚える必要は無い。
へー、fgetcharも使わないの?
PC用のアプリ作る場合、Cの標準関数ってほとんど使わなくね。
便利な関数がいっぱいあって楽になったように思ってると 基本的なところでハマるような scanfの書式を一生懸命覚えようとしてる人が...
scanfって長さ指定出来たんだ ありがとうございます
<windows.h>の中身でよく使う基本的なものを教えてください コマンドプロンプトには飽きたのです
つ WinMain
>>114 DispatchMessage(), GetMessage(), IsDialogMessage(), PostQuitMessage(),
SendDlgItemMessage(), SendMessage(), TranslateMessage()...
winuser.h -- USER procedure declarations, constant definitions and macros
>>114 内容古くなってきてるが猫でもでも見れば
>>103 scanfの中も&sになってることにも突っ込んでやれよ
動かないことは無いけどさ
>>119 コンパイルで警告出るレベルの間違いを態々貼ってるんだから、103は釣り。
初心者がスタックオーバーフローを疑問に思う時点でおかしいもんな
/* 文字列sの長さを返す */ int strlen ( char *s ) { char *p = s; while ( *p != '\0' ){ p++; } return p-s; } 戻り値をポインタ演算のp-sで返して、int型というのは一般的なんでしょうか。
size_t
int strlen ( char *s ) { int i; for (i = 0; *s != '\0'; i++); return i; }
size_tは違うべ
size_t だと負数が返せないだろ
sizeof(s) / sizeof(s[0])
strlenに限った話じゃなくて、ポインタの引き算の話じゃないの?
ポインタの演算は初心者には推奨されていない?
for (i = 0; *s != '\0'; i++,s++);
strlenに限った話じゃないならptrdiff_tだろ
初心者ならではの回答だと思ってた
初心者は異常系を考えないから、負数は不要と思い込んじゃうんだよね
それ、初心者対初心者では?
stddef.hをしっかり読め
strlen は size_t と規格で決まってる
一方std::stringはstd::string::npos == (std::string::size_type)-1を使用した
とりあえず
>>142 が中級の下だということがバレた
それは数値としての-1に意味はない
npos というシンボルに、通常あり得ない数である「符号無しの最大値」を使っているだけ
符号無しでもエラーを表現出来るという話以上の事はしてないけど
まあ何だ、ストリップでも見に行けよ
で、具体的にCでstrlenに負数やらエラー表現が必要な場合って何よ?
strlenに必要なんじゃなくて、 それを扱う先で必要になるんだろ
引数がNULLの場合くらいだな やるとすれば 何か返すにしても0返したのでいいと思うけど、区別したい場合もあるかもしれない 先にチェックしても手間は変わらない気もするが・・・
だな strlen にエラーは必要ないわ
どうすれば出来るか分かりません...教えてください。 [数字を入力]-->[(入力した数字)/2=0になるまで[2で割った余りを表示 --> 2で割る -->2で割る]をループ] #include <stdio.h> int main () { int i[2]; printf("数字を入力してください。¥n"); scanf("%d",&i[0]); printf("%dを2進数に変換すると、¥n",i[0]); i[1]=i[0]; while (i[0]!=0) { i[1] = i[0] % 2 ; printf("%d",i[1]); i[0]/2; } printf("¥n"); return 0; }
>>150 #include <stdio.h>
void func(int n){
if (n / 2)func(n / 2);
printf("%d", n % 2);
}
int main (){
int i;
printf("数字を入力してください¥n");
scanf("%d", &i);
printf("%dを2進数に変換すると、¥n", i);
func(i);
printf("¥n");
return 0;
}
>>151 ありがとうございます。
for,whileで作ることは不可能ですか?
>>150 i[0]/2;
は
i[0]/=2;
だな。
あとそのプログラムだとMSBとLSBが逆に表示されるから、
反転させるのは自分で考えな。
>>152 #include <stdio.h>
#define N 2/* N進数 */
int main (){
int n, i = 63;
char a[i + 2];
printf("数字を入力してください¥n");
scanf("%d", &n);
printf("%dを%d進数に変換すると、¥n", n, N);
while (n) {
a[i--] = n % N + '0';
n /= N;
}
printf("%s¥n", a + i + 1);
return 0;
}
再帰とか重くなるし見辛いだけだから使わない方がいい
馬鹿にはそう感じるんだね
GCC のクロスコンパイラを作る話はここで OK? それともどこかにちゃんとしたスレある?
それのどこが入門編だよ
161 :
デフォルトの名無しさん :2013/01/31(木) 21:09:13.21
いえいえ、お礼はいらないよ
むしろ謝罪しろ
164 :
デフォルトの名無しさん :2013/01/31(木) 23:29:57.50
(⌒⌒) ファビョ━ l|l l|l ━━ン! / ̄ ̄⌒⌒ ̄\ | __λ_ | | ノ ヽ 〆| | | ノ \| | / #ノ(_)(#) \___ /TT|/ | |UU| | ̄ ̄| | ̄| _| ̄|__| ̄|_□□ | ̄| | ̄ ̄| | ̄| | ̄| | ̄| | | |  ̄ ̄ | | __ |_ __ __| / /  ̄ ̄ | | | | | | /| | | │ | ̄ ̄| | | _| |__ |_| | | / | | ̄ ̄| | | / / | | / | | | │  ̄ ̄_/ / | _ | / / // | |  ̄ ̄_/ / / / | |/ / _| ノ ノ | ̄ ̄_/  ̄| | |/ // |/ | | | ̄ ̄_/ /_/ | / / ∩∩∩  ̄ ̄  ̄  ̄  ̄ | ι ̄ ̄ ̄| |_____|
おもいっきりC++だけど、C言語の範囲なのでここで質問します QTextStream qts(&f); QString dat = qts.readAll(); return dat; ← これはNGだと思うんですが、どうやってreturnすればいいんですか?
そこのqts.readAll()が返してるくらいだから返せるんじゃないの?
メイン関数からいろんなサブ関数に同じ値受け渡しまくるくらいなら広域変数にした方が良いですか?
グローバル変数はどこで書き込まれどこで読み込まれるか、じっくり調べでもしない限りわからない。それはある種の危険を伴うのでは?
value dealer なる怪しげな機能を作ればいい
setter/getter の再実装ですか?
書き込みは限られた場所からのみ 読み込みは全体からできる そんなのないですか
グローバル変数をstaticで宣言すると、そのファイル内の関数でのみ参照でき外部に非公開
ファイルが別なのでだめです
マクロでごまかす
175 :
デフォルトの名無しさん :2013/02/04(月) 00:58:46.93
fflush() を全部の printf() の後にいちいちつけたらどうなる?
static void*にゴッソリmallocして後はメタる #define VALUE0 (*(const int*)&VALUE0RW) #define ARRAY0 (*((const int*)[10])&ARRAY0RW) #define VALUE1 (*(const long*)&VALUE1RW) #define VALUE0RW (*(int*)UNQNAME) #define ARRAY0RW (*((int*)[10])(&VALUE0RW+1)) #define VALUE1RW (*(long*)(&ARRAY0RW+1)) #define GETPTR void* UNQNAME=get_ptr(); #ifdef IMPLE #define UNQNAME 0 #define RQSZ ((char*)(&VALUE1RW+1)) static void*p; #endif main(){ p=malloc(RQSZ); #undef UNQNAME VALUE0RW=...
>>176 やってみたけど出力されませんでした。
gdbでbreakpoint貼ってみたらちゃんと通ってはいるのでもう何がどうなっているのか。。
>>175 > printf("ここでないお?!\n");
の1行前に
sleep(1); // 1秒待つ
を入れても表示されないかな。
それとか、
main()の最初に
setvbuf(stdout, (char *)NULL, _IONBF, 0);
を1行入れてみたら表示されないかな。
>>175 プログラム自体は正しい。
ライブラリなどのコンパイルオプションがが間違っているのだろう。
>>175 Debian(wheezy)のgcc(4.7.2)で
gcc -pthread 175.c
して ./a.out を実行して、
"ここでないお?!"
が普通に出るが。
funcじゃなくて&funcを渡してるのは問題ないの?
>>183 大丈夫だ。問題ない。
むしろ関数のときだけ & 省略が許される例外みたいなもん
配列も
186 :
デフォルトの名無しさん :2013/02/04(月) 20:06:00.45
そもそもC等だとi++じゃなくて++iと打つのが普通だし(for文の中を除く)
用途によるだろ
俺だったら、+ を1回多く打つ刹那の時間、 次のコーディングイメージを頭に思い描いていたけどな。
前置する必要がある時以外は後置してるな。++
>>186 馬鹿死ね消えろ
a++;
--a;
が普通、というかこれしかない
ポストインクリメント・デポストデクリメントが唯一無二、それ以外のアーキが存在するとでも?
スタックをみよ。
デポストデクリメントw
a += 1; a ++; a -= 1; a --; 読みやすいので a++; a--; 使います。
アホがスレ伸ばすネタを投下しないように
>>193 だからいっただろう?
a-- なんてありえないんだから、馬鹿しかつかわない表記なんだから、読みやすいとか理由にならないから
死ね
薬用石鹸デポスト! 好評発売中!
197 :
175 :2013/02/04(月) 20:24:45.23
環境はこれです。 Windows7 + cygwin1.7 + gcc4.5.3 gcc -lpthread main.c sleep(1);をprintfの前に入れても結果は同じでした。。 呪いの類ですかね・・
198 :
175 :2013/02/04(月) 20:27:02.79
>>180 setvbuf(stdout, (char *)NULL, _IONBF, 0);入れたら出るようになりましたー!
環境依存?!
knoppixやってみて それでもダメなら 呪い
>>197 正直なところ、マルチスレッドにて、各スレッドが共有するストリームになんの下準備もなく直に書き込むこと自体が怪しいと思うのです。
スレッド共通なものに対して個々のスレッドがばらばらとアクセスするときは、まず例外なく排他処理を行うべきだと思うのです。
pthread には win32api の criticalsection がないのでヘタレの私には堪えます。
>>180 いれるのなら join の前にsleep かなあ‥‥‥
チャイルドプロセスが走りすらしていない状況で join してしまうとどうなるのだろう‥‥‥
挙動を見るに、初めてのprintfの実行時に何らかの初期化が動いていて、 それがメインスレッドでないと不具合を起こす、という感じに見える
>>198 出たのは良かったけど、なんだろうね。マルチスレッド全く知らないのでコメント出来ない…。
cygwinの持っているライブラリがバッファリングのデッドロックを起こしていたのかな。
205 :
204 :2013/02/04(月) 21:19:57.85
206 :
175 :2013/02/04(月) 21:37:17.77
>>205 ありがとうございます。
もやもやだけど暫定的な回避策になりそうです!
ぷらぷらあいよりあいぷらぷらの方が言いやすいから単発で使うときは後ろ置きばっか使ってるわw
ようわからんがメソッドの引数で使う時くらいだろ i++,++iの違いが出てくる時なんて
while(i++) while(--i) が多いかな まあ、while 自体あまり使わんが
まちがえたから
>>209 1回回すなら
int i = 1;
while (i--) {
}
じゃないの?
>>212 i-- を使うやつは馬鹿と決まっている
先に計算してその結果を使いたいなら前置、計算前の値が必要なら後置 どっちでもいいならC言語では好きなほうでいい
C++という名前のくせにi++より++iを推奨するC++はクソ。言語名前を変えろ。
結果としてCと変わらないソクドヲ提供しますってことだろ?
ならば int i = 0; while (++i&1) {}
だから++i使う奴はあほだと何べんいったら
for使えよ
>>202 ぷっ
>いれるのなら join の前にsleep かなあ‥‥‥
ならどれくらいの時間sleepすれば”確実に”スレッドが走り始めるのかなあ…
>チャイルドプロセスが走りすらしていない状況で join してしまうとどうなるのだろう‥‥‥
プロセスとスレッドの違いもわからない似非玄人は黙っとけよ
a++と++aに迷ったらアセンブラ出力してみるといい 同じになったなら好きな方にすればいい
>>221 ふーん、createthread() と join() とはプロセスにおけるfork()とwait2() の関係をスレッドに投影したものと考えたらいいのね。
いちいち起動待ちのイベント(win32)をいれていたけれどもそんな必要はないのか‥‥‥。
>>223 わかってねーうんこは引っ込んでろ。
> いちいち起動待ちのイベント(win32)をいれていたけれどもそんな必要はないのか‥‥‥。
> いちいち起動待ちのイベント(win32)をいれていたけれどもそんな必要はないのか‥‥‥。
> いちいち起動待ちのイベント(win32)をいれていたけれどもそんな必要はないのか‥‥‥。
> いちいち起動待ちのイベント(win32)をいれていたけれどもそんな必要はないのか‥‥‥。
> いちいち起動待ちのイベント(win32)をいれていたけれどもそんな必要はないのか‥‥‥。
>>224 あれ、経験ない?
サブスレッドが走り出す前に親スレッドのCreateThread()がじゃんじゃんまわって、何がおこっているのかさっぱりわけわかんなくなったことがあるんだ。
そこでイベントを使ってサブスレッドが走り出すまでは次のCreateThread()にいかないようにしたんだけれども、まあそんなことしなくてもいいみたいなんだね。
わかってないのは、まあそのとおりなんだけどもね、ああごめんね posix と win32 をごっちゃに話しして。
> あれ、経験ない? ねーよ。うんこは引っ込んでろ。
>>226 ふーん、まあ1000個とかスレッド生成をループで連発する方もする方なんだけれどもね、でもいっぺんやってみたかったんだ。
肝コテ粘着注意
>>227 はいはい
CreateThread()でチャイルド”プロセス”たん(笑)を1000人生成して
にゃんにゃんしてればいいじゃん
問題はスレッドを1000個つくった事ではない。お前のようなうんこがプログラミングした事だ。
>>229 あれ?プロセスとスレッドを混同したようなふうにみえるのかなあ‥‥‥チャイルドスレッド、っていういいかたがまずかったのか。にゃんにゃんしたいだけして楽しかったんはそうなんですけど。
細かい書き間違いに揚げ足とるバカに 脊髄反射するバカに
K&Rには結構 ++i の書き方が多い
それぞれの内訳はいくつだよアホ 感覚だけでモノ語るなタコ
>>232 Qzといううんこにまともに突っ込むのは愚か者。↓こういうのに対して斜めに突っ込んだ結果
> チャイルドプロセスが走りすらしていない状況で join してしまうとどうなるのだろう‥‥‥
↓更にこういう間抜けな発言が飛び出してくる。
> ふーん、まあ1000個とかスレッド生成をループで連発する方もする方なんだけれどもね、でもいっぺんやってみたかったんだ。
このうんこ本当に何にも知らずにプログラム作ってるんだな。大学の宿題レベルがちょうどいいわ。
>>234 試しにi++と++iをカウントしてみた。電子書籍は楽だな。
K&R 2ndでi++ 42件、++i 17件。
そのうち、配列のインデックスなど前置である必要があるのは2つで、残りの15はどっちでもケース。
おはよござあああああああっす
K&Rと言ってみたいお年ごろ(はぁーと)
i++; が ++i; でも i--; が --i; でも、処理に対して正しく使われていれば どっちでも イイ!
>>237 >>233-234 がたまたま目についただけで、簡単にカウントできる環境があったからカウントしただけ。
> 世界じゃそれをなぜ必死?と笑うんだぜ
>>235 それを世間じゃゲスの勘ぐりと笑うんだぜ。
>>237 たぶん
> それぞれの内訳はいくつだよアホ
と煽ってみたのにあっさりカウントされて顔真っ赤なんだろう。
↑顔、真っ赤ですよ
カウントと言いたいお年頃(はぁーと)
あっさりカウントしちゃった俺カッケーまぢで と言いたいお年ごろ草
>>237 なんかの歌詞かと思ったけど違った
電車男か・・・
煽り耐性ゼロの必死すぎる暇人とキモコテの長文コラボで カオティックな展開になっております
>>231 pthread_create()してるのに生成したスレッドが中々スケジューリングされないって経験ならあるよ。
それが理由で、Webで散見されるpthread_mutex()のサンプルが使い物にならなくて苦労した。
まぁ、Linuxでμs単位のスケジューリングを期待しちゃダメって話なんだけど。
オープンソースのライブラリ等を使用してプログラムを作る際、 ライブラリのコードを変更することなく、ライブラリに定義されている関数の挙動を変えるにはどうすればよいでしょうか?
オーバーライドすれば?
Cでオーバーライドってできるの?
パッチを作って「こっちの方が便利(速い)」と開発者にフィードバックする。
同じ名前の関数名でコンパイルしてそれを普通にリンクすればいいのでは
Cってオーバーライド出来ないんだ
253 :
デフォルトの名無しさん :2013/02/06(水) 15:27:59.42
マクロでどうにかしてみる
c++のclassの関数のオーバライドはちょっと違うんじゃね
>>247 まともな回答がほしければokwaveとかY!知恵遅れあたりへどうぞ
シンボル衝突時にどっちを採用するか(またはエラーとするか)はリンカ次第じゃないの?
>>247 つ
>>253 #define で違う名前に変換こんな感じ
#define xmalloc(x, y) malloc(x)
#define xfree(x, y) free(x)
#define xrealloc(x, y, z) realloc(x, y)
#include <stdio.h> void hoge(int a) {printf("OK\n");}; #define hoge(a) \ if (a==1) printf("NG1\n");\ else if (a==2) (hoge)(a);\ else if (a==3) printf("NG2\n"); int main() { hoge(1); hoge(2); hoge(3); return 0; }
inline使えよw
ライブラリ関数の中から呼ばれる関数はどうやって対応すんの?ってことでしょ 例えばライブラリ関数say_hello()からsay()が呼ばれるけどsay()の挙動がおかしいと。 このときsay()を自前のに置き換えるにはどうすんのかね?
オープンソース、というのだから同じく
>>257 でいけばいいんじゃない?
すげかえ#define を .h にかいておき、ライブラリのすべての .c でその .h を #include
バイナリエディタでsay()の名前を変更 自作関数でsay()を作成
名前残ってないんじゃね?
ライブラリなら名前残ってるだろ
ライブラリ=so なら残るだろうが 質問者が想定してるのはもっと広義なライブラリなきがする
patchあてろ。 まで理解した というわけで誰かあてかた教えて
ライブラリの問題なのか俺々実装の問題なのかをよく考えませう。
バイナリをなんとかしようとするのはそもそも無理ゲーなのでは? オープンソースっていうのだから、最小限のソース変更で切り抜ければいいのでは?
>ライブラリのコードを変更することなく、 だからなあ
じゃあリンカを改造するしかないね
置き換えたいのは標準関数なの?
お引取り願いたいanyにvoid any()__declspec(selectany){...}しちまえばいいんじゃないかな void any()__attribute(ナントカ){}とか
detours
はじめまして 大学の課題で以下の課題が出ているのですが、 方針がさっぱり立たないので、どなたかご教授していただけないでしょうか? よろしくお願いします。 長いので分けます。
1.16Xnビットの符号なし整数を,16ビットの符号なし整数n個の配列を 使ってあらわすことを考える.配列の要素の添字0を最下位16ビット,添字 n−1を最上位16ビットとする. 2つの16Xnビットの符号なし整数が,配列aと配列bに格納されているとき, この2つの符号なし整数の和を計算して配列cに格納したい. たとえば,n=3の場合,16進表示で下記のような計算を行いたい. 85ac 8001 e4f3 + af54 b345 0c8e = 3501 3346 f181 -------------- -------------- -------------- a b c なお,aの85acが最上位(つまり,添え字2に対応),8001は添え字1に対応, e4f3は添え字0に対応している. この場合,最上位から1が桁上がりとなる. 整数n,配列a,b,cを引数とし,最上位の桁上がりを返す関数addを作成せよ. ただし, 16ビット符号なし整数 = unsigned short 32ビット符号なし整数 = unsigned int とする.
>>275 > どなたかご教授していただけないでしょうか?
どこの馬の骨ともわからん名無しを弟子に持つ気はない。
>>276 unsigned short add(unsigned short n, unsigned short *a, unsigned short *b, unsigned short *c)
{
unsigned short carry = 0;
unsigned int tmp = 0;
int i;
for ( i = 0; i < n; ++i ){
tmp = a[i] + b[i];
carry = tmp >> 0x10;
c[i] = (unsigned short)(tmp & 0xFFFF);
}
return carry;
}
つか大学生なら頭良いんだろ?簡単に解いてくれよ
俺なんか中学不登校、底辺高校からの専門程度なんだから
あ、ミスった。tmp = a[i] + b[i] + carry;だわ
>>279 ありがとうございます。
専門が情報系ではないのですが、授業の過程に入っていて苦戦してました。
お手数ですが、コメント(この処理は何をしている)などの説明も
教えていただけたら幸いです。
よろしくお願いします。
>>281 専門行ってるとは言ったが、俺も情報系ではないぞ
天下の大学生サマとしては
「やること沢山あんだからんなことやってる暇ねぇよ!」
かもしれないけど、せっかくだから自分で考えてほしいわ
そこまでむき出しだと低学歴の俺でもひく。
間違いなく勘違いされてるし、多分誤解をとくことも出来ないだろうが、学歴コンプレックスというわけではない 自分はそういう専攻じゃないから〜とか言って、考えようとしない姿勢が嫌いなだけだ 同じとこに通ってたやつにもずっとこういう対応をとってきてる
こんなところでそんなアピールされても
この程度にコメント求めるとか 教える方が悪そうな感じ
俺1日5k回以上キー叩いてんだな
(x > y) ? return x : return y; と記述するとなぜ構文エラーとなるのですか
return書いとるからと違うけ その書き方、誰に教わったんかいな
全てがQZに見え始めたか...
病気の人はそっとしておいて
2次元空間の点を表す構造体\texttt{struct point2d}と 線分を表す構造体struct linesegmentを使い,2つの線分 struct linesegment line1とstruct linesegment line2とが交点を 持つかどうかを判定し,交点を持つ場合には1,持たない場合には0を返す関数 int if_intersect(struct linesegment line1,struct linesegment line2)を作成せよ. struct point2d {/*2次元空間の点のx座標とy座標をそれぞれdoubleに格納*/ double x; double y; }; struct linesegment {/*線分の始点sと終点eをそれぞれstruct point2dに格納*/ struct point2d s; struct point2d e; }: これってどうやったらいいのですか? さっぱりわからなくて・・・
>>295 交点の求め方がわからないの?
二点があれば、その二点を通る直線の一次関数が求まるでしょ?
その二つの一次関数を一次方程式に見立てて解を求めるだけだよ。
答えだけが欲しいなら、宿題スレに。
と思ったけど、宿題スレは酷い有り様だなー。
>>296 方針が立たないです。
宿題スレで聞いてもスルーされるかなと思い、
こちらで質問させていただきました。
既にスルーされたから来たんだろ
だからと言って、Cの問題でもないなぁ。 数学板にでも行けば?
構造体って便利だな 学習し始めたばっかだけど
>>293-294 一行で済むのにわざわざcodepadに張り付けて、mainの後ろに/* end */入れる
異常に自己顕示欲の強いチンカスはQZ
そして
> return (x > y) ? x : y;
素人っぽい。
CADなどに使われる奴だろ? ぐぐれば出てくるよ、たぶん
>>302 じゃあどう記述すればプロ()っぽいんだよ
やってみろよ
if (x > y) { return x; /* xを返す */ } else { return y; /* yを返す */ }
等しかったらどうすんねん
ナニイッテンダヨ...
これ、問題文の意味がわからないんですけど・・・ プログラミング言語C 第2版 p61 位置pから始まるnビットをyの右端のnビットにセットし、他のビットは そのままにしたxを返す関数setbit(x,p,n,y)を書け。 xを返してもあまり意味がないような・・・yはどうなるのかと。
>>305 三項演算子の回答として書いてんのに、なにいってんの?ww
三項演算子ってそんなに使う?
時と場所と場合
つかわなくても、よめなければならない
関数をよぶとき、引数に三項演算子をいれてるのをみたことある
314 :
デフォルトの名無しさん :2013/02/08(金) 16:48:26.80
10数年ぶりにいじってるがmakefileの記述わすれたw 001.exe : 001.obj bcc32 001.obj -e001.exe 001.obj : 001.c bcc32 -w -c 001.c -o001.obj clean: del *.obj del *.tds これでいいはずだが001.objと001.tdsが消えてくれないw どうすれば消せるの? BCC5.5.1でDOS窓アプリ作ってます
>>305 あなたの言ってるのが正しいなら
returnの後に/*??を返す*/って書くのも
「以上に自己顕示欲の強いチンカス」ですね
>>314 何時まで20世紀のコンパイラ使ってんだよ捨てろよ
Cなら問題ないのでわ?
でわ
>>316 煽りは良いから正解をはよーw
抽象論はいらないから具体的かつ確実な方法でw
>>314 makeはどのmakeかによって方言があるので、自分の使っている
makeがどれなのかまず調べて、そのmakeの使い方をググれば
出てくるよ。一般的な疑問だから資料はたくさんある。
たとえばVisual Studio Express付属のnmakeだったら
nmake 使い方
でググればいっぱい出てくる。
>>314 よく判らんのだが、make cleanしても消えないってこと?
どっちみちCの話じゃないけど。
324 :
314 :2013/02/08(金) 18:30:18.34
みなさんありがとう 解決しました 001.exe : 001.obj bcc32 001.obj -e001.exe del *.obj del *.tds 001.obj : 001.c bcc32 -w -c 001.c -o001.obj これでいいようでした お騒がせしました
>>324 よくねーよ
空行がいるだろ
そもそも毎回コンパイルされるだろそれ
001.exe : 001.obj bcc32 001.obj -e001.exe 001.obj : 001.c bcc32 -w -c 001.c -o001.obj clean: -del 001.txt dir 001.obj >> 001.txt dir 001.tds >> 001.txt
dir 001.txt
で?
勝った
330 :
319 :2013/02/08(金) 21:01:57.16
>>319 struct linesegment line1 = { {0.0, 0.0}, {2.0, 1.0} };
struct linesegment line2 = { {1.0, 2.0}, {1.5, 0.0} };
だと、交わるはずなのに「交わらない」と出るのでダメだ・・
332 :
319 :2013/02/08(金) 21:31:28.99
333 :
319 :2013/02/08(金) 21:46:59.41
>>332 は、
>>330 の線分の交点が[0.444444, 0.222222]と間違って計算されてしまう。。
>>332 計算式が正しいかは見てないけど、m[2] は間違いだと思う。
335 :
319 :2013/02/08(金) 22:54:08.66
>>334 ああ、ありがとうございます。
その通りです。m[1]が正しい。直して正しい値が出るようになりました。
ttp://ideone.com/SVmxzK ちなみに、
[x1, y1]を通る直線(傾きはm1)は、
Y - y1 = m1 * (X - x1)
[x2, y2]を通る直線(傾きはm2)は、
Y - y2 = m2 * (X - x2)
交点[kt.x, kt.y]は上の[X, Y]を求めれば良いので、それで計算しています。
>>336 いや参考程度にしてください。私も初心者です
338 :
デフォルトの名無しさん :2013/02/09(土) 01:25:56.61
>>315 ほら、正しい事が証明できた。
アンカーは間違ってるし、不正コード混じってるし、漢字変換も間違ってるし、なにより論理破綻。
これが
>>290 がチンカスQzである証明。
return ((line1.s.y - line1.e.y) * (line2.s.x - line1.s.x) + (line1.s.x - line1.e.x) * (line2.s.y - line1.s.y)) * ((line1.s.y - line1.e.y) * (line2.e.x - line1.s.x) + (line1.s.x - line1.e.x) * (line2.e.y - line1.s.y)) < 0 && ((line2.s.y - line2.e.y) * (line1.s.x - line2.s.x) + (line2.s.x - line2.e.x) * (line1.s.y - line2.s.y)) * ((line2.s.y - line2.e.y) * (line1.e.x - line2.s.x) + (line2.s.x - line2.e.x) * (line1.e.y - line2.s.y)) < 0;
>>338 厨は「論理ろんり lonly!!」と連発するが、正直「論理」がいかほどのものか?
http://ideone.com/sEtStK ここに挙げてあるソースコードが gcc環境でうまく実行できません。
コンパイルエラーは出ないのですが、実行がどうもうまくいきません。
どなたか教えてください。
下はプログラム内で読み込んでいるファイルの中身です。
1 鈴木 21
2 横山 27
3 高野 68
4 河野 17
5 ミルコ 34
6 ヒョー 32
7 A-san 45
8 B-san 70
9 C-san 5
10 D-san 15
>>341 ptr->prev = (*top);
がよくわかりません。どんなリストを作りたいの?
ideoneって閲覧者IPを採れるんだっけ?
348 :
デフォルトの名無しさん :2013/02/09(土) 10:32:49.13
>>340 自己愛性性格異常者にはわからないようだ。
> あなたの言ってるのが正しいなら
> returnの後に/*\374\374を返す*/って書くのも
> 「以上に自己顕示欲の強いチンカス」ですね
>>342-
>>347 ファイルポインタでファイルを読み込んで
最終的に年齢順に昇順でソートを行えればよいです。
バブルソートを使っています。
宿題は宿題スレへ。
宿題スレで論争がはじまったぞ
>>341 fileOpen()内で宣言しているファイルポインタを
返しているから?
main()内で FILE **fp を作り、そこに渡してみれば?
>>341 ,349
そーすそのままで、gcc version 4.7.2 での実行結果。
--------------before sort--------------
[1]:鈴木さん:21歳
[2]:横山さん:27歳
[3]:高野さん:68歳
[4]:河野さん:17歳
[5]:ミルコさん:34歳
[6]:ヒョーさん:32歳
[7]:A-sanさん:45歳
[8]:B-sanさん:70歳
[9]:C-sanさん:5歳
[10]:D-sanさん:15歳
--------------after sort--------------
[9]:C-sanさん:5歳
[10]:D-sanさん:15歳
[4]:河野さん:17歳
[1]:鈴木さん:21歳
[2]:横山さん:27歳
[6]:ヒョーさん:32歳
[5]:ミルコさん:34歳
[7]:A-sanさん:45歳
[3]:高野さん:68歳
[8]:B-sanさん:70歳
D-san・・・もらっていいですか
>>314 対策1 make clean とコマンドプロンプトから直打ち
対策2 cleanのターゲットに 001.exeを入れる clean : 001.exe
>>356 ありがとうございます
gcc から実行ファイルを指定して実行する時
どのようにコマンド入力しましたか?
358 :
357 :2013/02/09(土) 22:48:30.91
356は安価ミスです。
すいません
>>354 の方
gccから実行ファイルを指定して,実行するとき
どのようにコマンド入力しましたか
お前が何してどういう結果になったかを書けよ
gccから実行ファイルを指定して,実行するって、無理
362 :
デフォルトの名無しさん :2013/02/10(日) 07:59:26.86
C言語の入門書これは! おすすめて本しりませんか?
しりません
オライリーのナッツシェル
>>362 「独習C」。各章ごとに練習問題があり、
実際に動かしながら学べます。
あくまでも、コンソールアプリ止まりですが…。
C#やPHPjavascriptPerl色々やってきて、Cもやってみようと思ったんだけど この言語難解過ぎるだろう・・・
その辺と比べたら構成要素はダントツで少ないんじゃないの?
>>362 「C実践プログラミング」 でCの文法、make、gdbなど、基礎を習得
↓
「C言語ポインタ完全制覇」 or 「秘伝C言語問答 ポインタ編」 でポインタに関して完全理解する
↓
「エキスパートCプログラミング―知られざるCの深層」 でスタック、ヒープ、リンカ、ローダなど周辺知識を習得
↓
「C言語によるオブジェクト指向プログラミング入門」 で大規模プログラムの作り方を学ぶ
↓
「C言語デバッグ完全解説」でバグに強いプログラムの記述法をマスター
↓
「Code Complete(上)(下)」でより良いC言語プログラムとは何かを各人で考察する
↓
神の誕生
たった8冊で神になれるなら読んでみようじゃないか
円周と円の面積を表示するプログラムをこのスレの住民の方お願いします
公式当てはめるだけじゃねえか・・・小学生でも出来るぞ
頭脳が小学生並みなんで分かりません
小学生並みの頭脳なら、C言語覚えるのはあきらめましょう。
お前には2chは早すぎる
^^;
独習Cやったら後はひたすら実践 ぶっちゃけ本をたくさんよりも、いかにやるかが重要だろう
>>369 神になった人は、ソフト道探求の為、仙人となった。 みんな貧乏。 だって仕事しねぇんだもん! 断ってばかり・・・
Cでオブジェクト指向ってなんだよ
指向するのは勝手だろ。 言語に機能が備わっていないからすごいことになるだけで。
そんなことができるのか?仮想関数はどう処理する?まさか、vtable が表に見える表現なのか? OOの一面に記述方法で機能を表現するというのもあるが、vtable が裸でみえるゴダゴダな状況で、それでも機能を表現している、と胸をはってもいいものか?
ンじゃあどうやってC++のコンパイラは書かれてんだよ ナニで書いてるんだよ どうする?じゃねーんだ もうすでにOOじゃない何かの言語でOOのコンパイラが実装されてんだ
>>382 C++「トランスレータ」はOOではありません霧
>>381 普通に、オブジェクト指向で設計したものを、
「すまんがお客様の都合でC言語で実装しても欲しい、ということになった」
と糞営業から言われたことを想定すればいい。
がんばれば、オブジェクト指向をC言語でも実装できるよ。
はたしてそれをオブジェクト指向のソースと理解してもらえるかは別の話で。
struct xxx_softc {
struct ifnet ifnet;
>>384 >はたしてそれをオブジェクト指向のソースと理解してもらえるかは別の話で。
うふふ、そういうことですね。霧
まあ、オブジェクト指向をかじったんだろうな、 というCソースはたまに見るよね。 そういうことを実現したいためにC++になったわけだし。
> まあ、オブジェクト指向をかじったんだろうな、 > というCソースはたまに見るよね。 > そういうことを実現したいためにC++になったわけだし。 Qzと会話できる奴はやはり低脳な発言をする。
わーい、煽るしか能のない人に煽られちゃったよー(^O^)
FILE周りはオブジェクト指向的な設計に近い もちろん継承とかがあるわけではないが
Cでオブジェクト指向な設計してるソフトなんて沢山ありそうだけど。
構造体なんてオブジェクトそのものだろ。
jpeglibは継承とかオーバーライドとかやってるぞ。
int型の多次元配列でも int array[5][5] = {-1}; みたいな初期化はできるの?
ハ?
++はオブジェクト指向言語なのか?
>>394 for分使って2重ループで代入するってことか?。
入れ子初期化はエレガントじゃないよな
どんなのができればエレガントなんだ
int array[5][5] = {{1,2,3,4,5},{1,2,3,4,5},-1};
オブジェクト指向かどうかは言語に依存しない わかってるやつはCでもオブジェクト指向のプログラムを書く 分かってない馬鹿のために言語仕様でオブジェクト指向のプログラムを 書けるようにしたのがC++やJavaなのだ
403 :
デフォルトの名無しさん :2013/02/10(日) 20:56:39.94
>>397 のような人が回答者として紛れ込んでる事実に驚愕
int arr[5][5] = {-1,}; // 全部-1初期化
任意の値を初期化するなら
int arr[5][5] = {
{1, 1, 1, 1, 1},
{2, 2, 2, 2, 2},
{3, 3, 3, 3, 3},
{4, 4, 4, 4, 4},
{5, 5, 5, 5, 5}
};
二次元のイメージまんまに入れるとしたらこんなん
オブジェクト指向って指向なんだし、コードレベルでの話だよなーと俺はいつも思うわけだ
>>404 >int arr[5][5] = {-1,};
gcc は怒ってくる‥‥
$ gcc -ansi -pedantic -Wall array.init.01.c
array.init.01.c: In function ‘main’:
array.init.01.c:6:3: 警告: 初期化子のまわりのブレースを欠いています
array.init.01.c:6:3: 警告: (near initialization for ‘b[0]’)
>>404 >int arr[5][5] = {-1,};
borlandコンパイラだと、arr[0][0]だけに-1が設定され、
あとはすべて0で初期化される。
>>404 では
int arr[5][5] = {-1,}; // 全部-1初期化
と書かれてるけど、これが間違ってるってことか。
>>410 それで全部-1が入るコンパイラはCの規格には従ってないよ。
組み込み向けとか独自仕様とかあるのかもしれないけど。
>
>>397 のような人が回答者として紛れ込んでる事実に驚愕
涙なしには読めない
規格のどこだか忘れたが、初期化に足りない分は0で埋めるって書いてあった気がする
>>413 規格書はその辺りの記述が回りくどかった記憶がある
うろ覚えだと、直接的な記述が無くて
「静的記憶域期間を持つ変数と同様」っていうような形
>>404 なんか言いたいことある?
ISO/IEC 9899:1999 (E)
6.7.8 Initialization
21 If there are fewer initializers in a brace-enclosed list than there are elements or members
of an aggregate, or fewer characters in a string literal used to initialize an array of known
size than there are elements in the array, the remainder of the aggregate shall be
initialized implicitly the same as objects that have static storage duration.
JISだとこの辺かな? JIS X 3010 PDF96P 集成体型の要素又はメンバの個数より波括弧で囲まれた並びにある初期化子が少ない場合、又は大きさが既知の 配列の要素数よりその配列を初期化するための文字列リテラル中の文字数が少ない場合、その集成体型の残りを、 静的記憶域期間をもつオブジェクトと同じ規則で暗黙に初期化する。
うん
○for分使って2重ループで代入するってことか?。 ×int arr[5][5] = {-1,}; // 全部-1初期化 息してる?
×
>>397 のような人が回答者として紛れ込んでる事実に驚愕
○
>>404 のような人が回答者として紛れ込んでる事実に驚愕
Cでオブジェクト指向? 大抵、時間の経過と共にメンテできなくなって終わり。 神レベルの人が退職等でいなくなれば、あまりの複雑さに誰も近寄らなくなる。
C++の機能は例外以外はCで完全に表現できるらしいが メンテしやすいかどうかは別の話だな
>>422 例外もsetjump, longjump でOK。霧
なんでトランスレータ作れないよーって事になったんだっけ? 単にsetjmp/longjmpだと効率が悪いってだけ?
なってねぇし 効率もわるくねぇよ 一番最悪なのが誰の頭だかわかるだろ? オメェだよ
>>422 暗黙に呼び出される時のデストラクトは無理じゃね?
あとjumpだと、スタックの巻き戻しが出来ない気が
無理・できない はアホの鳴き声 それ以外の頭いいやつが実装してるよ
>>421 百人単位で使うライブラリを神レベルの人がC言語でオブジェクト指向で
実装して、大混乱に陥れた挙句、その人はレベルが低すぎるってやめて
しまって、さらに大混乱になった事例を知っている。
そして、「でもいいもののはずだ」という上の判断からそれが使われ続けて
阿鼻叫喚の地獄絵図に。
もう10年以上前の話だけど。
>>426 スタック巻き戻しに備えるために
setjmpが必要な時点で効率悪い
>>429 その神レベルのライブラリ、一度みてみたい。プロトタイプ宣言だけでもいいから教えてくれませんか?
>>431 おいおい、守秘義務を何だと思ってるんだよw
このスレは初心者が初心者に間違いを教えるスレですか?
はい
おとなしくC++使えばいいのにね
436 :
デフォルトの名無しさん :2013/02/11(月) 12:23:42.44
今、C言語を勉強しようとしている普通の者です。 かなり恥ずかしい質問なんですが、 始めるにあたり、まず何を用意すべきなんでしょうか? それらしいサイトまではいけるんですが、いつも途中で解らなくなり、挫折してしまいます。 コンパイラというものが必要らしいんですが、それはどうすれば入手できるんですか? ものすごく基本なことなんですが、案外、きちんと解りやすく説明しているサイトも書籍もないんです。
コンパイラが存在しない場合も
>>432 プロトタイプなんてみてもなんのことだかわからないはず :-) でしょw
まあしかたがないねえ
441 :
デフォルトの名無しさん :2013/02/11(月) 12:52:17.76
いえいえ
#include<stdio.h> struct Car { int num; double gas; }; int main(void) { struct Car Jpn={10,10.264}; Car Usa={65,654.687}; printf("車のナンバー%d:ガソリン量は%f\n",Usa.num,Usa.gas); printf("車のナンバー%d:ガソリン量は%f\n",Jpn.num,Jpn.gas); return 0; } main内のstructは略しても大丈夫?
CならNo C++ならYes 普通はtypedefして省略できるようにする
Cなら普通はtypedefして省略できるようにする、ね C++なら気にしない(C互換性が必要ならするが)
Cではtypedefしないとだめ typedef struct Car Car; struct Car { int num; double gas; }; もしくは typedef struct Car { int num; double gas; } Car; C++ではtypedefなしで略してもよい
C++ならおk CではNG
おおレスありがとう C++環境でCやってるからこういうことよくあるんよ
#include<stdio.h> typedef struct Car { int num; double gas; }Car; int main(void) { int *an; char *anan; printf("%d\n%d\n",sizeof(*an),sizeof(*anan)); printf("構造体struct Car型へのポインタのサイズは%dバイトです。\n",sizeof(Car *)); return 0; } ()内の*の位置はどういう意味があるんですか?
本読め
質問が曖昧でした 後者の*の位置はなぜ前者と違っているのに成り立つのですか?
お前はprintfの文字列の中に書いてある日本語も読めないのか
Cのtypedefは宗教によっては厳禁になっているので注意。
こんな定石を禁止してるとこなんて見た事無い
>>452 バカにしないで教えてくれ
赤い犬ってなんですかって言ってんじゃないんだから
>>455 いや、だから文字列に書いてある通りだろw
(*anan)と(Car *)の違いがわからんのだが
成り済ましはスルー
>>458 コンパイラは変数の型を知っているから、変数からでもサイズを算出できる
つまり、
(*anan)は sizeof char と同じ結果になる
(Car *)はそのまま型のサイズになる
あーあ
printf("%d %d\n",sizeof(Car),sizeof(Car *));
>>458 sizeof演算子は二通りの用法がある。
sizeof 単項式
sizeof (型)
sizeof(*anan)は前者 ()は省略出来てsizeof *ananと書いてもよい
sizeof(Car *)は後者 ()は省略できない
何でもすぐ正解を教えてちゃ成長しないぜ
初心者が見当はずれな事ばかり教えてるから
成長させたいのか それとも知識をひけらかしたいのか 回答者は前者でなくてはな
教えることによって自身が成長する、というのも十分にあると思う そう思って回答しているとずいぶんと違うものになるだろう
前者が出来てから言う事だよそんなのは
469 :
デフォルトの名無しさん :2013/02/11(月) 17:50:50.39
sizeof演算子の使い方を知らずに見当違いの回答つけてた初心者が逆切れした。 そんなに回答者気分味わいたいなら、「初心者が初心者に偉そうに回答するスレ」でも作ってそこで回答しろ。
じゃあ、入門編の質問なんて全てggrksだな
>>466 それ以前に「ウソを教えない」、「見当はずれのレスをつけて混乱させない」 これ超重要
誰がどういうウソを言ってるんだ? そもそも誰もウソなんて言ってないように見えるが
確かに。
見当外れとか思ってる奴が一番の初心者だな
476 :
デフォルトの名無しさん :2013/02/11(月) 18:09:23.01
sizeof演算子の使い方を知らずに見当違いの回答つけてた初心者が逆切れした。
見当違いの回答なんて誰もしてないように見えるけど、 一体お前の目には何が見えているんだ
478 :
デフォルトの名無しさん :2013/02/11(月) 18:14:07.64
質問者は > (*anan)と(Car *)の違いがわからんのだが と言っている。そして > 後者の*の位置はなぜ前者と違っているのに成り立つのですか? とも言っている。つまり、型と単項式の区別がついていないのだ。 それを説明せずに > コンパイラは変数の型を知っているから、変数からでもサイズを算出できる とは見当違いもはなはだしい。
それ俺じゃないし
変な知識を振り撒くなよ。 sizeof はどちらの使い方でも単項演算子だよ。
あ、すまん。 式と型と言ってるね。 あってる。
>>478 別に間違った事言って無いじゃん
Car*が型だってのは文字列に書いてある通りだし
ソースに説明の無い上の方の行の説明をしただけなんじゃないの?
俺じゃないから意図は分からんが、
少なくとも間違っては無いし
1から10まで全部言うよりは教育的
いや、この程度ですら言うべきじゃないと思うが
なるほどー。
>>478 が自分の知識をドヤッてだけに見えてきたね。
何か正論なのにカワイソス。
printf("%d\n%d\n",sizeof(anan),sizeof(*anan));
考えればわかる事は教えない。ところがプログラミング言語の文法は人が作ったものだ。 どんなに頑張って考えても正解にはたどり着かない。 int a; 1 sizeof a; 2 sizeof int; 3 sizeof(a); 4 sizeof(int); 何故2だけエラーになるのか考えてもわかるわけがない。 単に「そのように定義したから」 このような事を考えさせる意味は全く無い。教育的云々をいうなら説明せずに 「文法書読め」が正しい。 だらだらと↓こんな説明する意味は全くない。 > コンパイラは変数の型を知っているから、変数からでもサイズを算出できる
どう見ても揚げ足取りにしか見えないが
わかるんだな それが その辺りの比較的上の部分なら ちゃんとした理由がある
>>485 やっぱり小さい。
ますます、本質をついているのは
>>460 ではないかと言う雰囲気が。。。
その丸暗記的な考え方が少々気にかかる。
sizeofの次に来るものをキャスト演算子と同じ形にすれば 構文解析しやすいからじゃね
敗走したか
構造体の構は8X5Cで2バイト目が\か warning出て文字化けした。
↑8D5Cだった
そんな事よりsizeofの結果を直接%dで表示すんなって方が重要 64bit環境で誤動作する可能性がある 明らかに31bit超えないならintでキャストしとけ
64bit環境でというか、64bitコンパイルしたら、だな
はあああああああああああああああああああああああ
>>458 は
>(*anan)と(Car *)の違いがわからんのだが
そもそもポインタの基本がわかってないんだから、それ以外のことを言っても・・・
えっ?
さてはコテをはずしたQZがまたやらかしたか
文字列比較っていうかstrcmp関数についてわからないことがある 例えば、str[20]という文字配列にscanfで任意の文字列を入力する そして、endと入力したら処理を終了させたい そのために、strcmp( str, "end" )で比較した しかし、endと入力しても一致しない 理由は要素数が20ある文字列配列と比較してるからなんだろうけど、どう弄ったらいいかわからん
先頭から1Byteずつ調べる
>>500 戻り値を真偽値と勘違いしているに1ペリカ
「scanf("%20s", str)」としてみたらいかが?
>>500 if ( !strncmp(str, "end", 3) ) {
break;
}
と、3文字で比較すれば良さそう。
strncmp()使ったら、endianとかenderとかの場合困るじゃん
>>507 if ( (strlen(str) == 3 ) && !strncmp(str, "end", 3) ) {
break;
}
く、くるしい・・・。
e→n→d→nullと来ればいいから、strcmpにこだわらなければ行けるかな? その後にどんな文字が来ようと
strcmp使えよw
まあ、
>>503 だよなぁ
scanf()は入力文字列のケツに\0付けるんだから、そもそもこの場合はstrcmpで問題ない
うほっ
最近はチンパもキーを叩くのか
>>514 昨日のテレビ観たの?
京都大学霊長類なんとかのアイちゃんとその息子が出てた。
タッチパネルにバラバラに数字が一瞬だけ表示されて、
その数字が四角いボタンに切り替わる。
その四角いボタンを元の数字の順序通りに押せば正解というゲームで、
人間はすぐ忘れてなかなか正解が出せないけど、チンパンジーは
全て正解する。しかも物凄い速度で。
そりゃあ三食昼寝付きで衣食住確保されてて、 タッチパネルを性格にタッチする仕事だけしてればいいんだったら楽だよなあ
あのチンパンの瞬間記憶は人間が失ってしまった能力だって言ってたな。
>>517 死刑囚でもなけりゃ仕事は中でやらされるかと。
>>517 の禁錮刑は動物園のこと言ってるんだと思った
百里からT-4@すと
>>518 興味深いね。
そういえば長いソースをちらちら見ていたと思ったら、問題の箇所、話題となっている箇所をピタリと当てる人がいた、これはチンパン能力なのか?
>>523 >長いソースをちらちら見ていたと思ったら、問題の箇所、話題となっている箇所をピタリと当てる人がいた、これはチンパン能力なのか?
ソフトウェア開発では、わりと普通のことだけど。
一般的なことだと、役割などを一言で説明できないような関数、変数には問題があることが多い。
コードレビューの際に感じる違和感や、アンチパターンと感じられるものを確認すると、バグが見つかったり
改善点が見つかったりする。
ソフト特定の事になると、バグが発生する箇所、問題になる箇所は大体、数カ所に集中するので、
その部分との関連を確認したりする。
なるほどね 近い将来、静的解析ツールを買うとチンパンの入った箱が送られてくるようになるね
チンパンジーならロンゴロンゴが理解できるかもしれないな。
面白くないよ。
まだチンパの話してんのかよ
表示サイズが20文字の表示器がある。 ここに文字列20文字以内を表示し、左に流れていくようにしたい。 表示する文字がなくなったら、今度は表示器の右端から文字列が 流れてくるようにしたい。 それを所定回数ループする。 左に流れていくのはできるんだが、右端から流れてくるようにできない。
そうですか。
Windowsなんですがコンパイラは何を使うのがいいでしょうか? 将来的にはLinuxでコードを書く予定なので修正が必要ないほうが良いんですが
VC++
533 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/02/13(水) 21:06:00.13
>>529 組み込みかい? どんな入力するとどんな出力になるというデバイス仕様がわからないと話にならないよ。
>>531 VMにLinux入れて、それでやるのが一番
次点でcygwin
EclipseのC++拡張でいいんじゃね
>>533 あ、そうだ。大変失礼しました。
標準関数でいうところのputcharやprintfに該当するものは
あるので、DOS窓で
Hello*****
ello******
llo*******
lo********
o*********
*********H
********He
*******Hel
と表示できればできるかなと思って。
537 :
529 :2013/02/13(水) 21:31:30.33
こういう問いに変更したい。 char *s = "Hello"; char t[11] = "**********"; がある。下記の出力になるようにせよ。 Hello***** ello****** llo******* lo******** o********* *********H ********He *******Hel ******Hell *****Hello ****Hello* ***Hello** **Hello*** *Hello**** Hello*****
539 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/02/13(水) 21:32:27.13
>>536 ASCII文字のみなら文字列バッファとmemmoveを使えばできると思われ。
日本語が含まれるなら半角ズレの処理が必要。
540 :
529 :2013/02/13(水) 21:41:12.88
おおざっぱな問いなのに、答えてくれていだだいたり、アドバイスをくれた方 に感謝する。
たぶんリングバッファがあればいいんじゃないかなあ という気はする
543 :
542 :2013/02/13(水) 21:50:46.63
あ、 > char *s = "Hello"; > char t[11] = "**********"; 見てなかった
544 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/02/13(水) 21:53:12.81
void f(char *s, char *t) { char buf[11];int i,len = strlen(s); for(i=0;i<len;i++){ strcpy(buf,t);strcpy(buf,s+i);puts(buf);} for(i=10-1;i>=0;i--){ strcpy(buf,t); if(10-i>len)strcpy(buf+i,s);else memcpy(buf+i,s,10-i); puts(buf);} }
#include <stdio.h> #include <windows.h> #pragma comment(lib, "kernel32") int main() { char *s = "Hello"; char t[11] = "**********"; int i,j; strncpy(t, s, strlen(s)); while (1) { for (i=0; i<strlen(t); i++){ for (j=0; j<strlen(t); j++){ putchar(t[(i+j)%strlen(t)]); } putchar('\r'); Sleep(500); } } return 0; }
文字列操作を直感で使えるようなライブラリがほしいです
GLibでも使えばよくね
550 :
529 :2013/02/13(水) 22:51:31.08
おぉ、こんなに。多謝です。
初歩的な質問で、すみませんが、 本に、if分のネスト数には限界があるとのことでした また、else-ifの梯子は、 if(){ }else if(){ }else if(){ }else if(){ … と書きますが、実際には if(){ }else if(){ }else if(){ }else if(){ … とのことでした つまり、else-ifでの分岐にも限界があるのでしょうか
向いてないから死ね
>>551 2つの例ともにネストされてないんじゃないの?
JIS規格によると、15段までと規定されいているらしい。
if 〜に移った段階でelseブロックが閉じてるからネストはして無いわな 規格でどう捉えるのかは知らんけど
ネストしてるよ
if () { } else { if () { } else { if () { } else { if () … } } }
ていうかどっちも同じじゃん 改行しただけで
556のコードだと次のifに取り掛かった段階でelse節が中括弧のせいで閉じてないからな
下のような構造体のポインタのポインタのメンバにはどのようにアクセスすればいいですか? typedef struct { int **a; } b
流れを読まず、else-ifがいくつまで並べられるのか試すプログラムを作ってみた。
ttp://ideone.com/mWTotN 例えば make_code(2);を実行すると、以下のような test.c を生成。
-- test.c ------------------
int main(int argc, char *argv[])
{
if(argc == 1) {
return 1;
} else if(argc == 2) {
return 2;
}
return 0;
}
----------------------------
system(); で test.c をコンパイルするのを、else-ifの数を増やして挟みうちして、
コンパイルが成功/失敗するelse-ifの数を表示して終了する。
現在131072個をコンパイル中だが、CeleronM 1.86MHzでは結果が出るまで かなり時間かかりそう。。
>>559 typedef struct {
int **a;
} b;
func()
{
b data;
data->a = NULL;
}
swishでよくね
>>561 おかしいだろ
data->aじゃなくてdata.aだろ
564 :
560 :2013/02/14(木) 17:37:59.19
131072個をコンパイル中にトイレ行って戻ってきたら、PCの電源が落ちていた。
>>560 のプログラムのせいか…?
565 :
560 :2013/02/14(木) 18:08:32.90
もう一回やったら、また落ちました。
ノートPCですが、コンセントがつながっているのにいきなり電源切れました。
電源ボタンを押してもウントモスントモいいませんでした。
CPUのファンの出口がかなり熱くなっていました。
PC買って6年くらいだと思うけど初めての現象。
コンセント抜いて少し時間おいたら普通に起動出来たけど、
#############################################
# #
#
>>560 のプログラムは危険かも知れません!! #
# #
#############################################
131072個のif-elseを Debian で gcc でコンパイルしていただけなのに。。
すごい基礎的な質問ですけど、関数の引数がポインタのポインタの場合、実際に関数に渡す値は、ポインタですか?
ポインタってのは単にアドレスを格納する変数ってだけで *の数は何回アドレスを辿れるかってことでしかない
ぽぽぽぽーん
>>565 > 131072個のif-elseを
1572864とか平気で通ってる, それ以上になるとスワップが足りないらしい
ふむむ…文字列ポインタの配列を関数にわたすとき、なぜ引数をポインタのポインタにしなければならないのかもわからないです…
571 :
560 :2013/02/14(木) 19:18:18.50
>>569 試して頂いて感謝です。
if-else 1572864個で平気ですか。
私のPC(Dynabook AX53C, CeleronM 1.86MHz, Mem 1.0GB, Debian 7, gcc 4.7.2)
が熱暴走したのかな。。
572 :
560 :2013/02/14(木) 19:23:18.27
>>571 × CeleronM 1.86MHz
○ CeleronM 1.86GHz
Cやるなら3970Xくらい買わないと
面白くないよ
>>560 をScientific Linux6.3+gcc4.4.6でやったら、
PCは落ちないけど3022x個近辺でSegmentation faultが出る。
30227個, 30229個, 30225個と、安定しない。
怖いプログラムだなw VC++だとコンパイラが上限設定してたと思う 最近のは知らんが
昔、無限ループでひたすらサブディレクトリを掘り続けるバッチ作ったことあるけど、 そのときはブルースクリーンでPC落ちた。今やるとどうなるかは知らない。
仕様におけるネストの最低保証は15なんだし、それ以上になったらエラーで止まるほうが この場合はいいコンパイラだと思ってしまうな
if-elseのネスト(?)の検証してるみたいなので、ついでに
>>556 形式の深さのネストを検証してみた。
if(1)
if(2)
if(3)
printf("3\n");
みたいな感じで、elseはなし。
VC++8.0.50727だと124段目でネスト深すぎのエラー終了。
Ideon-Cだと8000でも通った(8200位で文字数制限なのかソースが途中で切れて書式エラー)。
そういえばIdeon-C++で試してないけど、まぁ似た様な感じだろうな。
で?
cygwin-gcc で %lld が使えないのはどうしてですか?
>>582 使えるけど
$ gcc -dumpmachine
i686-pc-cygwin
$ gcc --version
gcc (GCC) 4.5.3
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
これで↓が普通にコンパイルできて動く
#include <stdio.h>
int main(void) {
long long val = 12345;
printf("%lld\n", val);
return 0;
}
ヒュー、俺の糞スペの相棒でそんなコード走らせたら死ぬぜ
switchにも限界あるの?
投稿エラー: 本文が長すぎます!
だと。
http://pastebin.com/GPwnb1HC ISO/IEC 9899:1999 (E) 5.2.4.1 Translation limits
1023 case labels for a switch statement (excluding those for any nested switch statements)
>>585 >>560 をswitchにして
int main(int argc, char *argv[])
{
switch(argc) {
case 1:return 1;
……
case 123:return 123;
default:break;
}
return 0;
}
みたいなのを生成→gccコンパイルを試したら524288個くらいは出来ました。
ttp://ideone.com/YjokNL それ以上は当方のスワップが足りなくなったのでやめましたが、それまで
>>565 みたいに
(ノートなのに)いきなり電源が落ちることはありませんでした。
WIN32APIの勉強を始めたばかりで、ウィンドウクラスの登録を関数化したのですが BOOL wndcl(HINSTANCE); //プロトタイプ宣言 …… if(wndcl(hInst)==FALSE)return 0; //関数の呼び出し …… 関数の中身 if(RegisterClass(&wnc)==NULL)return FALSE; return TRUE;}で動くのですが一応あってるのでしょうか? サイトや参考書を見てもどれもATOM型という型を使っていて ATOM型はウィンドウクラスを登録するための型と仰ってるサイトもあって不安です。 ATOM型はResisterClassの成否を戻り値にできるためにウィンドウクラスに使われていると考えていいのですか? 調べてみるとATOM型はWORD型だったりして、なら素直にWORD型やint型でもいいんじゃないかと思ってもうわからないです
>>589 ソースに書かれた型が全部WORD型だったら、今扱ってる数値がアトムなのかウィンドウハンドルなのかファイルハンドルなのかインスタンスハンドルなのか
メニューハンドルなのかアイコンハンドルなのかビットマップハンドルなのかカーソルハンドルなのかデバイスコンテキストハンドルなのかモジュールハンドル
なのか、はたまたハンドルではなくIDなのかが一見して判らなくなるだろ
型の実装が被るのが気になるなら、
#define STRICT
#include <windows.h>
とかしておけば?
アトムはウィンドウクラスを識別するための値 異なるウィンドウクラスは必ず異なるアトムを持つ アトムは0にはならないので、無効なアトムやエラーを表現するのに0が使える アトムの型をATOMとしてるのは アトムだと分かりやすくするためなので アトムは素直にATOM型で扱おう
そんなことより ==NULL やめろ
ATOMはポインタじゃないからな ドキュメントにもエラー時は0を返すと書いてあるので 色んな意味で0と比較すべし
594 :
589 :2013/02/17(日) 00:26:20.18
>>590 >>591 ありがとうございます、ATOM型の用途が少しずつ見えてきました
異なるウィンドウハンドルを持つことが出来るということは
多重起動の判定なんかに使えると考えてもいいのでしょうか?
となるとBOOL型で関数を作るよりATOM型で関数を作るほうが色々と便利そうですね
>>592 >>593 NULLは0でdefineされてると聞いたのでNULLと0とFALSEを特に考えずに分けないで使ってました
きちんとポインタのみNULLを使うように心がけたいと思います
NULLの定義はC89では ((void*)0) か 0 だけど C99 では処理系依存だったはず C++ も最新の仕様では処理系依存になってたはず 実際ポインタに対してしか使えないよう 特殊な処理系独自の定義になってる事もある
いや、0でいいんだろ
NULLを使うことは書き方の約束事でしかない。 プリプロセッサーは NULLを0に戻し、 その0はコンパイラによってポインターとして解釈さ れる。 それでも特に関数の引数ではNULLに(0にも必要であるのと同じ で)明示的なキャストが必要かもしれない。 C FAQ 5章 ヌルポインター www.kouno.jp/home/c_faq/c5.html
>>597 >関数の引数ではNULLに(0にも必要であるのと同じ で)明示的なキャストが必要
これは
・プロトタイプを記述せずに前方参照をおこなった場合、
・かりにプロトタイプを記述するか前方参照が発生しないようにしても、可変長引数を呼び出す場合
ですね。後者は昔は (char *)0 とかを頻繁にみましたね。
>>595 言語的に0です。
0を入れておけば、アーキテクチャ的にNULLが0でなくても
勝手にアーキテクチャ上のNULLになったオブジェクトが生成されます。
>>599 3,4行目は正しいが、
「言語的に0です。」なんてことは全く言ってないな。
NULLを0に戻しとか寝言ほざくな 6.3.2.3 Pointers 3 An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.55) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function. 4 Conversion of a null pointer to another pointer type yields a null pointer of that type. Any two null pointers shall compare equal. 7.17 Common de?nitions <stddef.h> 3 The macros are NULL which expands to an implementation-de?ned null pointer constant
C++ってtypedef略しちゃってもいいの?
自己解決しました 質問には答えなくていいです
>>603 どう解決したのか書くのが礼儀じゃないか?
なりすましが解決方法なんて書くわけないじゃないか。
>>601 どんだけ的はずれなのか、訳してあげるからよく考えてみな。
6.3.2.3 Pointers
3
ポインタにおいて値が零の整数表現、つまりvoid *にキャストされた零表現をヌルポインタ定数と呼ぶ。
ヌルポインタ表現がポインタ型に変換されたとき、この結果、すなわちヌルポインタは他のどのようなオブジェクトや関数へのポインタとも異なることが保証される。
4
ヌルポインタを別のポインタ型に変換した結果は、そのポインタ型におけるヌルポインタとなる。(各ポインタ型における)ヌルポインタはすべて等しくなければならない。
7.17.3
マクロ NULL は処理系規定のヌルポインタ定数に展開される。
orの訳が変
零の整数、またはvoid *にキャストされた零 #define NULL 0 か #define NULL ((void *)0) のいずれか コンパイラメーカーの都合できめてもよい
対偶も知らんアホはプログラマやめろ
>>599 ヌルポインタは言語的に0で表現されるが、
NULLの定義は0とは限らない
あまり適当な事は言うな
↑アホ
ポインタにNULLを入れて何回でもdeleteしてやる
まずここがC言語スレだってことを認識しろ
>>614 これの後さんざん荒れたのを見た記憶があるけど何処だったっけ
>>616 何代か前のこのスレ、free(0)の話がえんえんと、QZが負けた
struct { char *a; int b; } aaa; を初期化する方法として memset(&aaa, 0, sizeof(aaa)); が良く使われるが、環境依存なので避けなければいけない。
書籍のサンプルプログラムでどうも腑に落ちない点がありましたので質問させてください。 さすがに書籍のコードをそのまま載せるわけにはいかないので、バグ(?)を再現できる短いソースコードを作りました。 #include <stdio.h> int main(void){ char c; scanf("%x%*c",&c); printf("0x%X\n",c); } ここで表示されるのが0x80でなくで0xFFFFFF80となるのはなぜなのでしょう? ご教示ください。
ごめんなさい、ソースコード間違えました! #include <stdio.h> int main(void){ char c; sscanf("0x80\n", "%x%*c",&c); printf("0x%X\n",c); } 失礼しました。。。
>>621 %x使うときはunsigned intでないとだめだよ。
charじゃだめなんですね。 この現象はprintf関数が勝手に変数cをint型だと解釈して、cの先の3バイトに格納された 値も読んで表示しちゃったって解釈でいいんですかね?
あれ?
#include <stdio.h>
int main(void){
char c[2];
c[1] = 0xab;
sscanf("0x80\n", "%x%*c",&c[0]);
printf("0x%X\n",c[0]);
}
でも動作は同じになるから
>>623 の解釈は間違い・・・?
仕様外のことをしているのでなんともいえんが、 おそらく sscanfの時点で本来unsigned intを取るべきところに signed charを使っているので0x80が-8と解釈されて リトルエンディアンでは 80 FF FF FF が代入されているんだろう。
ありがとうございました。 なんとなくわかった気がします。
違った。 俺の環境だと、 sscanfで 80 00 00 00 が入って、 printfで 80が-8と解釈されてunsigned intに変換された結果 FFFFFF80 と表示されるようだ。
sscanfで勝手にchar cより後のアドレスに書き込みがされるんですね。 下手すりゃメモリ破壊ってことですか?
しかもそれが、コンパイラでは警告もエラーも出せない部分でだからなあ
おまえら違うぞ。 cのアドレスにintで読み込んでメモリ壊してるのはあってるけど、 > sscanfの時点で本来unsigned intを取るべきところに > signed charを使っているので0x80が-8と解釈されて sscanfは渡されたアドレスがunsigned intなのかsigned charなのかわかるわけがない。 従って、 > signed charを使っているので0x80が-8と解釈されて はウソ。 0xFFFFFF80となるのは > printf("0x%X\n",c[0]); c[0]が -128(char)から-128(int)に格上げさるから。
unsigned ってなんですか?
署名されてない。つまり信用できないっていうこと。
信用できません
635 :
デフォルトの名無しさん :2013/02/18(月) 13:24:57.60
(signed) charがprintf関数内ですsigned intにキャストされるんですか? このキャストは仕様で規定されてますか?
汎整数拡張
637 :
デフォルトの名無しさん :2013/02/18(月) 13:47:52.83
>>631 signed -> 最上位ビットを符号ビットとして 扱 う 。
unsigned -> 最上位ビットを符号ビットとして 扱 わ な い 。
0X80 =( 1 0 0 0 0 0 0 0 )2
↑
最上位ビット
>>637 (訂正)
8ビット時
1 0 0 0 0 0 0 0
↑
最上位ビット
>>635 > このキャストは仕様で規定されてますか?
キャストとは呼んでいない。
JISが手元にないけど「格上げ」を使っていたはず、原文だとpromotion。
格上げは暗黙のキャスト動作だね。
キャスト演算子を使ったものがキャスト
>>637 なるほどすごい分かりやすいです
ありがとうございます
いえいえ
本当にご親切にどうもありがとうございました 重ね重ねお礼申し上げます
むしろ謝罪しろ
646 :
620 :2013/02/18(月) 17:44:03.66
みなさま本当にありがとうございます。 みなさんからのアドバイスをもとにいろいろググってみたところ、 暗黙の型変換やら符号拡張やらまだまだ学ばなければならないことがたくさん見つかりました。 謹んで修行いたします。 そして、こんなバグやらメモリ破壊やらを放置して平然とサンプルコードとして載せている この参考書の使い方も、ゆっくり考えたいと思います。 なんか誤字脱字も多いし。。。
しつこい
こんなの基本情報を取得していれば常識なのに これだから資格をバカにするやつらは困る
直接定数を書いて、~をとった場合は型の大きさに応じて計算されるのだろうか。 たとえば、int i = 1, char c = 1 と ~0 との & とか。
integral promotion/integer promotion 可変長引数は自動的に inategral promotion を適用されるのです。
1から始めようと思って参考書を買ってみたのですが、その通りにバッチファイルを作っても「パスが見つかりません」とエラーになってしまいます ファイルの位置も確認しましたし、位置アドレスをテキストコピーして貼り付けても、管理者として開いても駄目でした 作ろうとしたもの:本によればCコンパイラを使用できるvcバッチ(10日で覚えるC言語入門教室) 使っているもの:Visual Studio2010 OS:Windows7 メーカー:emachines 備考:家族と共用でアカウント分けているから指定しないといけない? よろしくお願いします
バッチファイルを作成してダブルクリックしてるんだろうな… その参考書の始めの方に環境設定とか実行方法の節ないのか? ないなら捨てろ。
VisualStudioのスレで聞け
vcvars32.batをまず実行しろ
657 :
653 :2013/02/19(火) 10:28:18.60
皆さんありがとうございます 試しにvcvars32とコンパイラを開いてみたら必要なdllが入っていないようでした 後でこの参考書は窓から投げ捨てよう
そこまで酷い参考書はさすがに出版されていないだろうから、 うまくいかないのはお前の読込み不足。
というかVisualStudio使ってるならF5キーでいいやろ
ctrl押せよ
ビットフィールドって構造体でしか使えないの?
malloc関数ってなんて読むの?
bitアクセスできるコンパイラを使ったことがある。
マリック
マルオッケー☆
その本は全然初心者向けじゃないようだな よりにもよって2chなんかで聞くハメになろうとは 従ってその本は焚書 まるでお前の役に立ってないからだ
inttype.h でプリミティブのサイズまで言語の範疇に入ってしまったから ますますビットフィールドは洋ナシ
?
>bitアクセスできるコンパイラを使ったことがある。 これへのレスだろきっと
ハード弄りたい人はないと困るだろ
673 :
デフォルトの名無しさん :2013/02/19(火) 21:08:57.69
質問です。やさしいCってのを まだ、60ページくらいしかよんでないです。 結局皆さんは、Cで何を作ってるんですか?
愛の結晶
初めてのCでも作れますか?
プログラミングなんて 何を作ったかすぐ忘れるくらいに 作り飛ばした おもったことをパッとやる 自分用のならその程度
>>673 俺もそれ読んでるわ
まあ俺ゲーム作りたくて基本を学んでる
最終的にはC#でVITAゲーム作りたいんだけどね
ファイル管理は自作のが一番使いやすい 他人のだともし削除したくないのが消されるかもしれないし
ゲームやツール類は鉄板だな
一言怒りをぶつけさせてくれ テキストの誤植で見本に\抜けてた 時間と手間返せ
教科書が常に正しいとは限らない という絶対的な真理を学んだようだな こりゃすばらしい それだけでその本の元はとれた
本をあたまから信じるとか 正直あり得ない 常に誤植を疑うくらいでないと (でも大抵は自分のミスなんだけどねw)
本をあたまから信じるとか 正直あり得ない 常に誤植を疑うくらいでないと (でも大抵は自分のミスなんだけどねw)
本をあたまから信じるとか 正直あり得ない 常に誤植を疑うくらいでないと (でも大抵は自分のミスなんだけどねw)
本をあたまから信じるとか 正直あり得ない 常に誤植を疑うくらいでないと (でも大抵は自分のミスなんだけどねw)
本をあたまから信じるとか 正直あり得ない 常に誤植を疑うくらいでないと (でも大抵は自分のミスなんだけどねw)
重要な事なので?
入門書とか初心者本なんて作者も初心者だったりするしな
知識がないのに本が間違ってるとか思う奴は勉強に向いてない
向いてないね
最後まで本が間違っていると思わない人は勉強に向いてない 自分で何も考えてない証拠
本を読むことは、他人にものを考えてもらうことである。 本を読むことは、他人の考えた過程を反復的にたどることにすぎない。 実際、本を読む際にはものを考える苦労はほとんどない。 ショウペンハウエル
QZみたいな思考力読解力のない人間にとってはそうだろうな
ショーペンハウエルがどうかしたか知らないけど、本を読むにも思考力が必要だぞ 全く理解できない本を読んでも何も身に付かない Qにとって都合の良い言葉を必死に探してきただけだろう
>>694 その書き込みがショウペンハウエルに考えてもらって何も考えてないってことを証明してるよなw
>>697 自己言及のパラドクスがえしにしては、いまいち
本を読む本 オヌヌメ
処理速度について質問です。 メイン関数内に a=1; b=1; と代入の処理を2件書いた場合と メイン関数内に a();←中身はa=1;を行う関数 b();←中身はb=1;を行う関数 という前者の処理を外部のサブ関数に書いた場合 飛ぶ処理分だけ後者の方が遅いですか?? 頻繁にループするような処理の場合は 出来るだけループ中に別の関数に飛ばさずに 全部ベタ書きした方が処理速度あがるんですかね…。 もちろん関数使った方が綺麗ですが。
>>701 関数で作って実行してみる
その部分で時間がかかっているようなら inline 修飾する
速度は実測が基本
ありがとうございます。 とりあえず作ってやってみます
いえいえ
むしろ謝罪しろ
さーーーっせんしたーーー
可能なら関数をstaticにしておく。 まともなコンパイラなら、最適化でインライン展開してくれる。
何を基準に「まとも」と言っているのやら 規格表にもない事を言われてもねえ
そりゃぁ、最適化の方針まで規格表に書かれてなんていないだろうよ。
だったら話すんなよ 処理系依存の話は処理系依存スレへ
かたいこというなよお
typedef struct avcst avc; main(){ avc * pa; } なんでこれでコンパイラ警告でないの?
>>713 struct avcst の中身がわからなくても pa の確保サイズはわかるから
>>713 それだけだとエラーも警告も出ないけど、
pa = (void *)0; //ここまではOK
pa++; //ここでエラー
になる。サイズが未定義の構造体へのポインタは
演算することができない。
所詮ポインタだからな
馬鹿なポインタ
馬鹿が使うとせっかくのポインタも糞まみれの汚物以下、 吐瀉物の泉とデスマーチの最後尾になる
あんたも昔は馬鹿だったんだから大目に見てあげなよ
もう批判はやめよう
>>722 そんなお前は・・・グフッ・・・俺はもうダメだ・・・(ガクッ
うああああああああっ兄さあああああああああああんっっ!
何故だっ、どうしてお前は兄さんにこんな・・・ひっ酷いことをっ・・・
ゆ・・・許さねえええええええええええええええ!!
>>723 なんで兄さんは死ぬ直前に気持ち悪い笑い声発してるの?
C#とくらべて、Cはかなり早いのでしょうか? 2倍も3倍も変わるのであれば書きなおそうと思ってるのですが・・・。
試して見たら?
JIT が十分に有効になるように書かれたコードなら ある意味 C より全然早いんだが > C# さすがにページング効率とかキャッシュ効率を十分 考えてコーディングされてる奴には負ける # ほとんど勝ち目がないのは並列計算が必要な所で # 並列命令使いまくった FORTRAN # C でも勝てない # MS の FORTRAN は使ったことがないが…
C#がCより速いのなんて見た事無いわ
C#とCくらいなら アルゴリズムの工夫>>>>>>>越えられない壁>>>>並列化>>>>>小手先の最適化>=言語 くらい
それはないわ 明らかにC#は100倍くらい遅い
起動が遅いのだけは間違いない
スクリプト言語だと許容できる速度を出すためにアルゴリズムを工夫することになって 結果的に最初からCで書いた方が早かったんじゃないかなんてことがしばしばあるけど C#ではさすがにそこまではないな
unsafe使わないと遅い事がほとんどだな
Cでも出来る範囲で遅かったら、Cの存在価値ないからな。
逆だ。C#に向いている分野があるからC#の存在価値がある
C++でコアな所つくってC#から呼び出したりしてる。
バグってるからスレタイが読めない
>>737 そうだけどC#から呼ぶためにインターフェイス部分はCにしてるよ。
C++/CLI使えば別にC++でも
switch(gs){ case 'g': return x; case 's': x=v; } これを三項演算子で書くとどうなりますか?
お前には理解できないものが出来上がるから聞くだけ無駄 訳:わたくしには分かりません
書けない
三項演算子は値返す以外できない
return gs == 'g' ? x : ((gs == 's' ? x = v : 0), (switch以降の処理));
わかんねえならif使えよ 冗長になるけど機能としては一緒だろ
三項演算子とか読みにくいだけだから使うな
boolの値を文字列表示したいときとか簡潔に掛けていいけどね printf("%s\n", flag ? "true" : "false");
printf("%c\n", flag["FT"]);
なんでわざわざ気持ち悪く書くのw
int n; if (・・・) n = 式1; else n = 式2; 式1と式2がほぼ同じで微妙に違うときとか条件演算子でまとめたくなるな。 まとめるのもやりすぎるとゴチャっとなるから悩むけど。
>>751 だよな…
こう書くべきだな
printf("%c\n", (!flag)["TF"]);
>>753 いや、寧ろprintf("%c\n", (!!flag)["FT"]);だろ。
ってのはさておき、"FT"[!!flag]だな。
キモッ
俺ならぜったいこうだな。 if (flag) { printf("true"); } else { printf("false"); }
おいおい、 printf(flag ? "true" : "false"); 派はいないのか?w
可変長引数の関数の可変長部分以外に変なものを仕込むと コンパイラが荒れ狂う可能性が高くなるからねぇw
なんねーよ。
やらかすとしても printf の第一引数に非リテラルな文字列渡し たまたま渡した文字列中にフォーマット制御の意図ではない % が居た こんなんしか思い浮かばん
フォーマット文字列解析して引数チェックするコンパイラの拡張機能は利用できなくなる。
>>758 は低脳っぽいっからこの事を言っているのではないと思うが。
教えてください。 char a[10]; scanf("%s", a); としたとき、10こよりたくさん入力されてしまったら困るので、 do whileとstrlen(a)で10以上入力されたとき再入力させるようにしたのですが、 10こよりたくさん入力されたら、結局他の変数の領域までつぶしちゃうようなのです。 どうすれば回避できますか? なんか見当違いならごめんなさい。
764 :
763 :2013/02/25(月) 22:09:26.10
配列を宣言するときの要素数は10のままで。
10こよりたくさんって、10こはおkなの?
\0が出現するまでという処理でなければおkになりうる
int main(void) { char a[10]; int len = 0; int idx = 0; int c; while((c = getchar()) != EOF) { len++; if(len < 10) { if(c == '\n') { a[idx] = '\0'; break; } else { a[idx++] = c; } } else { if(c == '\n') { len = idx = 0; continue; } } } return 0; }
771 :
763 :2013/02/25(月) 22:46:35.20
>>765 試してみましたが、
どうやら次のscanfに、はみ出た分を渡してしまってるような・・・。
>>766 10といったのは例えでそこはどっちでもいいです。
説明不足済みません。
>>768 試してみます
printf使う奴は情弱 ホンモノはvramに出力させる
%9s%*s
mainの中に書いてるからださいといったのではないだろうか
>>770 ,
>>773 >>769 は他のスレでも質問者に嘘を教えたりスレ違いの話題を投下して喜んでるマジモンの荒らしだから放置よろ
我慢できないならNG追加、質問者も混乱を避けるためにNG追加よろ
私怨は放置で
779 :
デフォルトの名無しさん :2013/02/26(火) 11:14:19.78
俺は放置してるけど>770みたいに反応する奴が後を絶たない。
PCの電源を切っておけば、気にならなくなる
久しぶりにC言語やりたくなった
放置してても最近は初心者に嘘教えるとか 荒らし方が巧妙になってきてるから、 多少の注意喚起はしといたほうがいい。
お前も巧妙な荒らしだ
バ片山が来ると盛り上がるなw
786 :
デフォルトの名無しさん :2013/02/26(火) 13:57:43.96
ソフト系板は全て実名必須にすれば良いのに
>>786 ほんとそれ思う
顔本と連携させてそういうのできないのかね
俺のニートがバレるからダメだろ
だめだよ。 実名晒しの脅しはゴミ山の十八番なんだから。 それを奪ったらかわいそうだよ。
おすすめの入門書ってありますか? ガチでなんにも分かんないから一から始められるやつが欲しいんだけど
始めて何をしたいの?
程度によるけど 『Cプログラミング入門以前』 から始めるといいかと思います
言語だけなら色々な読物があるのだが、環境整備からとなると難しい。
C言語ではなくプログラミングの初心者ならば JavaScriptからはどうか。 実効環境はブラウザ。 書いたテキストの拡張子をいろいろといじるだけ。 まずプログラミングのなんたるかのさわりを楽しみたいなら 実行環境がコストゼロで与えられているJavaScriptではどうだろう 入門書を探すのは、同時に、プログラミングを楽しみたい・使いたいという 隠れた欲求がある。 それを満たしてくれるのは備え付けのブラウザくらいだ
それならcodepad.orgでよくない?
どっちがいいの?
codepadのが軽いからC使いなら軽さ重視でcodepadだな
処理系古いんだよねcodepad
そうするとideone or codepadとK&Rで基礎を学ぼうか? GUI や IDE はその次だな。
伝説なんとかみたいでカッコイイideone フォントもカッコイイと思う
PATH通らないとか、studio.hで動かないとか、動いたけどなんか意図したとおりに動かないとか ポインタ分からないとか、参考書一冊読んだけど何も出来る気がしない、という未来が見える
knoppixを使うという手だてもある Cどころか様々なことができる もしかするとLINUX/UNIX環境への悟りが発生して 離れられなくなるかも
どうせ個人で作れるようなソフトは既にフリーソフトとして公開されてるんだから、 今更言語の勉強なんかしてどうするのよ、それより英語の勉強しろ
自分専用ソフトは自作が一番使いやすい
>>804 そうでもない。そうでもないから新しいフリーソフトが公開されるんだよ
ニッチな分野っていくらでもあるからなあ
>後で振り返ってみると、何であんなに使いにくいものを一所懸命使っていたんだろうとか、 >今のサービス無しで一体どうやっていたのか思い出せない、といった事がしばしば起こる。 >既存のものを根底から変えることは仲々想像し難く、また現実的な問題があって一挙に変化が起こるわけではない。 >それでも、今までの方法が余りに融通が利かなすぎる場合には、少しの改善でも大きな喜びを持って迎えられるのである。
モードレスダイアログボックスの設定でSTYLEをVISIBLEにしているのですが ShowWindow関数を使わないと表示されないのですが何が悪さしているのでしょうか? 一応ShowWindowを入れれば目に見えるようになるんですが #include "resource.h" #include<windows.h> DIG DIALOG 10 , 10 , 150 , 150 FONT 12, "MS ゴシック" STYLE WS_VISIBLE | WS_POPUPWINDOW CAPTION "モードレスダイアログボックス" BEGIN DEFPUSHBUTTON "ok",IDOK,7,69,50,14 PUSHBUTTON "cancel",IDCANCEL,100,69,50,14 LTEXT"モードレスダイアログボックスです",IDC_STATIC,39,16,94,8 END //リソースになります switch(msg){ case WM_COMMAND: switch(LOWORD(wp){ case IDM_DLG: hDlg=CreateDialog(hInst ,TEXT("DIG"), hWnd , DialogProc); //ShowWindow(hDlg,SW_SHOW); break;} break; //ダイアログボックスの呼び出しになります
>>811 お前が意味不明だよ
何のことだかさっぱり分からん
>>811 gccつーても化石の2.xから最新の4.7や4.8まで色々あるけど
4.6や4.7の最適化のダメさってどういうところ?
これ 低能rubistが群がってさらにアホなことになってるだけじゃねーの 高尚な話題出してるつもりが 本人たちの気付かぬところで低空飛行してるだけだ 閉鎖集団になると 横から口出ししても厄介野郎と思われて そいつらの本当のレヴェルの低さが露呈しない 危険だよ 大本営なみに危険だ 優秀で高尚だと凝り固まってるアホの集団が 本当におぞましい議論をそこらじゅうに拡散させようとしてる
>>790 亀だけど、ゼロからなら技術評論社の『C言語スタートブック』って本がいいかも。
コンパイラもついてるし、コマンドプロンプトの使い方やパスの通し方も載ってる。
要するにパソコンの使い方さえある程度知っていればプログラミング環境は整うような本。
内容もわかりやすい。
ただ、情報量はあまり多くないから、いずれはほかの本を読まなきゃいけなくなる。
>>804 そんなもんxhamsterとxvideosとtube8とその他諸々の
エロ動画収集を自動化するために決まってんだろ
アク禁された場合に抗う自動プロキシ経由接続完備
>>818 省略した場合にunsignedになる処理系も認めると言うことです。
実際、コマンドラインオプションでsigned/unsignedを切り替えられる処理系もあります。
>>819 そういうのあるんだ
始めて知った、ありがとう
charに関してはデフォがunsignedのほうがしっくり来るよね
チラシの裏にでも書いてろ
68系のコンパイラはunsignedなのが多かった。 なんかアーキテクチャによってどっちが有利とかあるんだろうな。
そういうのがって、ちょー有名な Microsoftのコンパイラなんだけど。
オプションで切り替えるぐらいgccにだってある
これは安全ですか? char* getChar() { char *s; s = "sss"; return s; } int main() { char *s = getChar();
その後 s[0] = 't'; とかやったら死ぬかもね。
安全
書き込みはともかく、意図したように読める保障あったっけ
>>830 "sss"がどのセクションに置かれるか考えれば自明
832 :
827 :2013/03/01(金) 23:23:07.11
>>828 ポインタに入れているのに、配列としてアクセスしているから死んじゃうって事ですか?
>>829 getChar()の変数sはメモリから消えているはずですが、mainで安全な理由がわからないです。
文字列"sss"はヒープに取られているということなのでしょうか?
javaだとthis.globalString = "aa";というコードよく書きますが、
C言語でm_globalChar = "aa";は安全なんですか?
"aa"は関数を抜ければ消えちゃう気がするんですが
>>832 >ポインタに入れているのに、配列としてアクセスしているから死んじゃうって事ですか?
違う。main()/s がさしているのは "sss"、これは文字リテラルと呼ばれ、格納先は書き込み可能な場所とは限らない。読むだけならば問題がない。
>"aa"は関数を抜ければ消えちゃう
大丈夫、消えない。
6.4.5/5 String literals の規定によりstaticであることが保障されているから安心しろ
"aa"は関数が呼ばれる前から存在している
838 :
832 :2013/03/02(土) 00:29:17.77
皆さん、回答ありがとうございます char* inputTest() { char *s: if (条件) s = "a"; else s = "b"; return s; } main() { char *s; s = inputTest(); この場合でもmainの変数sは安全なのでしょうか?
安全だ
おめえ分かってねえだろ
>>838 多分、関数を抜けた後にローカル変数の領域(スタック)が消滅してしまう事を知ったから不安なのだろう。
inputTest();の char *s;のために用意された領域は、関数を抜けると確かに消える。
しかし、inputTest();内で s= で得られた値(リテラルのアドレス値)は、関数をの戻り値として
main();の char *s; が受け取っている。そして、それを使っている。
inputTest();の char *s;の領域が無くなっても、main();のchar *s;がリテラルのアドレス値を
持っているから、それを使っても大丈夫。
ああ、説明がよく分からなかったら、無視してください。。
たぶん、 827 はポインタとポインタの指す先を混同してるんだろう 言語によってはポインタが無効になるとそれが指す先も無効になる (ガベージコレクション)があるけど、Cはそういうややこしいものは無い
シェルに表示させる文字とリダイレクトさせる文字を分けることってできませんか? @パラメータ入力を要求するメッセージを表示 Aパラメータ入力 B計算結果を羅列 ↑のような流れのプログラムがあるんですが @、Aだけは常に表示させて Bはリダイレクトやパイプを使わないときだけ表示させたいです
stdoutとstderrを使い分けてdev/nullを駆使する
Unix系だったら isatty() っていうのでファイルディスクリプタが端末に繋がってるかどうかわかる。
あう。デスクリプタ。
\bってどんな時に使うんですか?
エスケープシーケンスでググレ
今時++使わずにこっち使うメリットあんの?
今時#使わずに++使うメリットあんの?
C++はなかなかつかいこなせない
C#‥‥俺もC#に移行しようか、gcc が対応してくれたら
Cしか使えない環境もある
Cしか使えない俺もいる
クラスを使わなければそれほど変わらなくない?
その前提条件が既におかしい
必要に応じてCもC++もC#もどれも使ってる。
ソフト配布するときって免責事項書く?
書いといたほうが無難。逆に書かないメリットあるか?
このソフト[a.exe]は無料です。お金を払う必要はありません。 このソフト[a.exe]について作者は動作保証も使用に関しての責任は一切負いません。
免責事項ってどのくらい有効なのあれ
きやすめだ、きやすめ
859は無難とまで云うとるが
>>863 別に法的拘束力があるとかの意味じゃないよ。
無用なトラブルを避けらける(可能性が上がる)くらいの意味での無難。
[a.exe]を実行した責任については作者は一切責任を負わないものとします。 と書いたとしても、a.exeがウィルスだったら逮捕されるよ
逮捕されないなんて誰が言ったんだ?
善意でソフト配信するのもリスク負わなきゃいけない世の中なんて・・・ 西洋合理主義ってほんとどこまでいってもクソだな
ポイズン
TPPでまた変化あるかもな
TPPなんて言ってる奴はチョン そんな物ブラフだっつーの
備えをしないのは愚か者だよ
口を開けばすぐにチョンとかいってるやつの言葉は信用できない チョンが信用ならないのは事実だがそれ以上に胡散臭い連中だ 震災以後はとくにそれが目立ってきている
何かあってからでは手遅れということを前政権は教えてくれた
だからこそ 何かが起こる前に現政権を妥当しなくてはならない 国民よ立ち上がれ 戦いのときは近い
妥当だね
A,B,C! ABC! は〜ん、Eきも〜ち〜♪
T++
.tpp
tiny preprocessor ?
TechnicalPairProgramming
CentOS 6.3でC言語でプログラムを作成して動かしているのですが、 作成したプログラムのスタックサイズを調べる方法はありませんか? 関数単位、プログラム全体で知りたいです。
void gethaddr(char*a){printf("%s:x",a,a);} でもって .... return gethaddr(__FUNCTION__),r; とでも あとは出力結果から定消費を考慮した引き算といっちゃんデカイアドレスを探すだけだよ
?
デバッガに詳しそうな人に聞かないとな オレは使い方知らない
prinntf("%s:%x",a,&a); だな
call frame informationでも読め
磯野そんなことより -fstack-usage しようぜ
>>881 関数が相互再起してる場合はどうカウントするんだ?
>>881 アセンブリ出力をして、スタックを操作しているニモニックを関数ごとに抽出。
関数こーリングツリーを作成して、再帰がない関数までのスタック操作量を積算。
再帰関数では再帰深度をロジックから解析し、スタック操作量を積算。
>>889 使ってる共有ライブラリの中も考慮しろよ
というか普通は静的に分かるものじゃない
組み込みだろ。ワーストケースを想定する方法としては、ありだと思うよ。
C言語を勉強しています。 入力した行の長さを返すサンプルプログラムで cygwinのgccではテキストファイルからリダイレクトできて $ ./a.exe <text.txt 47 と実行できるのですが、DOSのコマンド上では同じソースファイルをコンパイルしても C:\>プログラム名.exe <text.txt C:\> となってしまいます。コンパイラは LSI C-86 Ver.3.30 試食版 です。
> コンパイラは LSI C-86 Ver.3.30 試食版 です。 まずこれをすてろ。話はそれからだ。
>>892 これで試してみて
#include <stdio.h>
int main(void)
{
int p=0, c, l=0;
while((c=getchar())!=EOF)
{
if(c=='\n') l++;
p=c;
}
if(p!='\n') l++;
printf("%d\n", l);
return 0;
}
LSIC86はもうWindowsの64だと動かなくなってるんじゃないか? 今更やるだけ無駄のような
コンパイラが動いてるならDOSモードな気はするけどどうなんだろ エミュレータを使ってもいいし マイコンでも20MHzいけるからRAMとか繋いでやればDOSくらい動きそうだ
>>896 マシンはWindows XP の 32bit です。
マシンも古いし、何か軽い動作のものはないかと思いまして・・・
>>895 訂正
int p=0, c, l=0;
↓
int p='\n', c, l=0;
LSIC使うくらいならコンパイルをVS2010のデベロッパコマンドプロンプトで行えば重くは無い
そのクソなテキスト text.txt をバイナリエディタで開いて ・文字コード ・改行コード この二つについて精査しろ 報告もしろ 今すぐやれ
俺なら、VC入れるぐらいならcygwin入れてgcc入れるけどなあ…。簡単だし
クノピクス勧める奴ってなんなの? せめてクソブンツだろ
クソブンツはさすがに苦しい
Vine が楽でいいとおもうけど
js/linuxが一番お手軽
sientificlinux最強
fflushって、バッファを閃光のごとく吹き飛ばすフラッシュだと思ってたけど、 閃光はflashで、flushは(バッファを)吐き出すって意味だったということを知って衝撃を受けた。今まさに。 ポーカーのフラッシュもflushだし、いろんな所で誤用、誤記してきた気がするわ…orz
トイレの水流すのがflushだな
おれは最初flushはIT用語だと思ってた たしか高校のころかな 英語の偏差値が30くらいだった 懐かしい
CentOS6でC言語(gcc)で開発してるのですが、セグメンテーションフォルトで落ちる時のバックトレースを シグナルハンドラ(SIGSEGV?)などで取得して、その情報をファイルや標準出力に吐いてから落ちたいのですが、 どうやればよいのでしょうか。 イメージ的には、落ちた時に作成されるコアファイルを用いてgdbで起動して、btコマンドで出力される バックトレースの情報が取得できればと思っています。 サンプルとなるソースコードがあるサイトなどがありましたらお願いします。
セグメンテーションフォルトで落ちるプログラムなんて作れないかわ わからん
いったいどんな品のないコード書いてるんだろう
セグメンテーションフォルトの起こし方 int *p=NULL; *p=4649;
そのためにcore吐いてくれるんじゃないの?
C言語はじめてからそういうアホなコードいっさい 書いたこと無いな。 たぶん頭のできが違うんだろう。
組込機器で万が一潜在バグでメモリぶっ壊して落ちた時のエラー処理として 障害解析用の情報を取っておけるようにしておきたいのです。
メモリぶっ壊して落ちる場合は机上でバッグがよい
組み込みってデバッグ情報埋め込んだままリリースするのが普通なの?
セグりそうな関数全部でバックトレース更新してmalloc(9)に入れときゃいいんじゃないの
ポインタにNULLを入れて何回でもfreeしてやる
このスレの人たちは2ちゃんねるの初心者多いですね。書き込む際に SG(セキュリティー・ガード)に登録しないと個人情報がバレますよ。 SGに登録せずに書き込んだ場合、あなたのパソコン内の 情報は他人に見られていると考えてほぼ間違いないでしょう。 個人情報がばれる方の多くはこの登録を怠っています。 初期の頃から2ちゃんねるにいる方達は、ほとんどの方が このBBSのコマンドの仕組みを知っています。 ですから簡単にあなたのIPアドレス等を抜き取り個人情報を見破ってしまいます。 このコマンドの方法は決して教えないというのが初期の頃から 2ちゃんねるにいる方達の間で暗黙の了解となっていましたが、 あまりの被害の多さに心を痛めた私はあえて公開することにしました。 SGしておけばまず抜かれるコマンド自体が無効になってしまうのでどんなにスキルが ある人でもIPアドレスを抜くことが不可能になります。 SGに登録する方法は、 名前欄に「 fusianasan 」と入れて書き込みする。 これだけでSGの登録は完了します。 一度登録すれば、Cokkieの設定をOFFにしない限り継続されます。 fusianasanは、正式にはフュージャネイザン、又はフュジャネイザンと読みます。 元々はアメリカの学生達の間で、チャットの時にセキュリティを強化する為に 開発されたシステムです。これを行うことにより同一人物が書き込んでいるか どうか判別する手段が遮断されるので安心です。 ぜひ書き込む前には 名前欄にfusianasanと入力してください。自分の身は自分で守りましょう
>>915 コアファイル出力設定
@「/etc/profile」内
ulimit -S -c unlimited > /dev/null 2>&1
A「/etc/init.d/functions」内
corelimit = "ulimit -S -c unlimited"
と、該当箇所を変更し、システム再起動。
組み込みでOSがない場合はセグメンテーションフォルトが起こらずに暴走かハングアップするだけじゃね?
CPUの例外ベクタに飛ぶから、そこで対処する。
プロってメモリリークやセグメンテーションフォルトはまず起こさないの? 二重解放を知らず知らずに起こしてたり、エラーが起きた場合の解放し忘れやら プログラム自体は動く事が多いから気づきにくいし、どんなあたりに気をつければ 安定で安全なプログラムになるの? 終了したら自動的にメモリ解放してくれればいいのに、GCは偉大と思う
gcあってもメモリリークは起こるけどな
ポインタにNULLを入れて何回でもdeleteすればいい
セグメンテーションフォルトよりはメモリリークのほうがいいから なるべく解放しないようにする
>>932 とりあえずelectric fence使ってみれば。
俺は才能ないからリークもSEGVも起こすぜ。
才能じゃなくただの注意力散漫だろ
>>936 調べてみたら結構便利そうね
今までwallopやデバッガで怪しそうなのは見てきたけど
注意力散漫だから見落とす事があったし
にしてもcallocやらmallocやらgloballockやらnewやらheapやらと多すぎて
自分以外に混乱起こす人いると思うんだ…たぶん
>>932 ツールを使ってもよいが漢なら自分でなんとかする
valgrindとMudflapも使っとけ
C++ だと RAII でかなり防げるんだけどな。
943 :
デフォルトの名無しさん :2013/03/08(金) 21:28:36.44
サーバ常駐のプログラムが一日に20Mづつリークするけど 月一でリブートするからおkってとこがあったなー
>>935 >セグメンテーションフォルトよりはメモリリークのほうがいいから
それはプログラムの用途による。
しかし、daemonやサービスなどプログラムが走りっぱなしにするものでは、
エラーでコケる方がマシで、メモリリークは不具合箇所の特定が難しい。
それに長期運用しないと、不具合自体が顕在化しないので
セグメンテーションフォルトの方がずっとマシ、と言う感覚。
リークするのはテメエの脳みそだけにしとけ
ideone.com/81yqG1 C始めたばっかなんで冗長なコードだとは思うが 質問したいのは104行目の戻り値がなぜかbnという変数に入ってしまう(ように見える)んだがその理由と改善策 あと116行目以降の戻り値でキャストなしでポインタをうんぬんという警告が出るんだが、ポインタのあたりがよく分かってない
bnに入ってしまわない stratの返値はintと指定したのにintでない物をreturnしてる 124行目のセミコロンはおそらく誤記 carddとstrat関数に返値をreturnしないパスが存在する
配列範囲外起こしてんぞ
配列の添え字はゼロオリジン
で?
うん。
952 :
946 :2013/03/09(土) 02:29:50.71
みなさん長いコード見てくれてありがとう
>>947 えーと実際に走らせてみると多分102-108行目でbnが変な挙動をするんだよなぁ……
ポインタを返したいときは関数は何にすればよいのでしょう
%sが指定子という事は、strat関数は戻り値で文字列を返したいのかな? なら関数はchar*関数名(int)にするとreturnで文字列を返せる
954 :
946 :2013/03/09(土) 02:34:06.49
連投スマン carddをvoidで書いてreturnなしにしてもbnが思い通りに動かなかったから 戻り値がおかしいわけではないようだ 要するにstrategyが3のときにbnが2になってくれないのです……なんでじゃ
bnを変化させるのは50行目と85行目のみ
>>946 突っ込みどころだらけではなしにならないんだが、取り敢えず>947の指摘はチェックしよう。
それと、慣れないうちは必ずブロック化した方がいいぞ。
957 :
946 :2013/03/09(土) 02:48:51.87
>>955 57行目と80行目のprintfは確認用なんだが、その間でどうもbnが動いてる
どう考えてもくさいのは58行目のcardd関数なんだが……
もしちょっと時間あるなら実際に走らせてみてもらえればわかるんだが、
結果の文章のplayerAで始まる各行の末尾の数字がそろわない行があると思う
触れてないはずのデータが壊れてるならバッファオーバーランでもしてんじゃね
959 :
946 :2013/03/09(土) 02:56:48.13
>>956 ポインタとセミコロンの件は分かった。ありがとう
[carddとstrat関数に返値をreturnしないパスが存在する]
「パス」の意味がちょっと分からんのだがパスでググっても出なさそうなので教えてくれ
ブロック化は今すぐしてみる
player配列の要素数はnum以上じゃないとダメだろう。
962 :
946 :2013/03/09(土) 11:57:46.57
>>961 そんなことは分かるわww
返値をreturnしないパスというのは具体的になんなのかがよく分からない
int func(int a) { if(a==1) { return 123; } } パス1:関数に入る→ifで判定、真→returnで関数を抜ける パス2:関数に入る→ifで判定、偽→returnせずに関数を抜ける
変数の取りうる値を見てから答えてやれよw
tftのよさを極限まで削った対戦方法だなw
968 :
デフォルトの名無しさん :2013/03/09(土) 12:41:02.56
論争が始まりそうな予感
969 :
946 :2013/03/09(土) 12:41:57.43
>>964 パスのことは分かりました、ありがとう
あとから色々付け加えるためにelseじゃなくてelse ifのままにしてたんだけど一応直した
>>966 とは?
同じ戦略同士の対戦がない 対戦回数が少ない
strategyには0から3のどれかが入ってる(ことになってる)んだから、値を返さないってことはないだろ
972 :
946 :2013/03/09(土) 12:55:17.83
>>970 あーそれはこれから色々付け加えるんだが
その前にtftがきちんと動いてくれないのでみんなに質問させてもらってる
もう一回質問したいことを繰り返すけど
strategyが3のときにbnが2以上になってくれない(というか多分59行目でcardd関数に入るとbnの値がおかしくなる)
のでその原因分かる人がいればおしえてください、ということです
自分の態度が悪いとかなんかあればスマン。以後気を付ける
Cはホントに初心者なんでわかんないことがあって聞き返すことがあるかもしれんがご容赦ください
毎回battle関数に入るたびにbnを1にしておいて3以上にならないとかw
974 :
946 :2013/03/09(土) 13:10:54.80
>>973 battle関数の中でfor文があると思うんだが
その中で同じプレーヤー同士が何回か繰り返し対戦することになってる
そこでbnを増やしてるんだが、「strategy=3のときだけ」bnがおかしくなるんですよ……
よく分からんが、このセミコロンはバグじゃねえの else if(player[a].strategy == 3) ;
55行目、 > for(c = 1; c < 3; c++) { で良いの?
まず、 >struct info player[3]; を struct info player[4]; にしたか?
37行目、リーグ戦みたいなループだよね? それなら37行目は > for (j = 0; j < num; j++) { じゃなくて > for (j = 0; j < num - 1; j++) { では?
そこは内側のループで弾かれるから動作に支障はない
だからplayer[0],[1],[2],[3]で4だっつの
981 :
946 :2013/03/09(土) 14:00:55.15
>>977 player[4]にしたらちゃんと動いた!ありがとう!!
でも理由が分からん……とりあえずnum+1の数の配列を用意すればいいのか?
オーバーフローなのかなあ
982 :
デフォルトの名無しさん :2013/03/09(土) 14:14:49.08
int num = 4;を#define NUM 4にして struct info player[3];をstruct info player[NUM];にしとけ for(j = 0; j < num; j++)なんかもfor(j = 0; j < NUM; j++)
984 :
デフォルトの名無しさん :2013/03/09(土) 14:19:00.05
日本語が通じないのはヤバイな…
向いてないから死ね
987 :
946 :2013/03/09(土) 14:38:11.53
すげえ恥ずかしい勘違いをしていたな…… そうかplayer[4]と書いて0,1,2,3か…… 大変お騒がせしましたorz
だからアホだよお前 向いてないよ 人の話きかね―モン 聞いてから40分で解決してンだろ? > 949 デフォルトの名無しさん [sage] 2013/03/09(土) 02:19:01.29 > 配列の添え字はゼロオリジン
989 :
946 :2013/03/09(土) 14:46:31.19
いや言い訳させてもらえるとゼロオリジンを理解していなかったわけではないんだが
その証拠に実は
>>980 は俺なんだ
思い込みの強い性格でな……まあそれが向いてないってことなんだろうけど
いい教訓になったよ、ありがとう
宣言時の要素数が0オリジンじゃない欠陥言語
>>989 いや言い訳は良いんだけど、それよりも前に、今までアドバイスくれたレスに返事レスが無いと
聞いているんだか聞いていないんだか分からない。
いちいち1レスごとにレスするのはまどろっこしいので、修正したソースをideoneに(新しく)上げるのが手っ取り早いと思うよ。
992 :
946 :2013/03/09(土) 16:37:58.82
みなさん色々ありがとう! 配列関係のレスに返事をしなかったのは配列には問題ないと「思い込んで」いたためです 申し訳なかった。 ideone.com/iLJYb1 こんな感じでバリバリ思い通りに動いてます! これから遺伝アルゴリズムを入れるのですが また詰まったらお世話になるかもしれません そのときはできるだけ思い込みを排して人の話を聞くようにするので許してね!
ポーランドの大数学者、ヴァツワフ・シェルピンスキーは・・・ 荷物を一つなくしてしまったのではないかと心配していた。 「そんなことないわよ、あなた!」と妻は言った。 「六つともここにあるじゃないの」。 「そんなはずないよ」とシェルピンスキーは言った。 「何度も数えたんだ。ゼロ、1、2、3、4、5」 の逆バージョン
>こんな感じでバリバリ思い通りに動いてます! これ見た後に ># 1: hide clone 8 minutes 6 seconds ago >result: not running これ見てなんか笑った
>>994 not runnningとなってるのは
アップロード時にコンパイルして走らせるチェックを選択しなかったためですw
自分のPC上では問題なく動いてますw
あ
い
馬鹿w
ら
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。