C言語なら俺に聞け(入門編)Part 56

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門篇) Part 55
http://pc12.2ch.net/test/read.cgi/tech/1256818218/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.69【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1256022655/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 131代目
http://pc12.2ch.net/test/read.cgi/tech/1255709298/
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
2デフォルトの名無しさん:2009/11/19(木) 18:47:37


一見正しいように見えて間違っているもの

「関数に引導を渡すにはどうすればいいのですか」



デバッグは大抵こんなもんである。
3デフォルトの名無しさん:2009/11/19(木) 19:06:59
参照渡しの続きをお願いします
4デフォルトの名無しさん:2009/11/19(木) 19:12:38
Cでは値渡し使えない。さらにポインタが使えなければ関数に自分の
変数を変えてもらうような処理フローが使えない。ただそれだけ。
5デフォルトの名無しさん:2009/11/19(木) 19:13:24
 
   参
   照
   皇
   大
   神
 
6デフォルトの名無しさん:2009/11/19(木) 19:14:02
>>4
Cでは値渡ししか使えない
の間違い
7デフォルトの名無しさん:2009/11/19(木) 19:14:36
>>4
プッ
8デフォルトの名無しさん:2009/11/19(木) 19:23:21
ツェーゲング
9デフォルトの名無しさん:2009/11/19(木) 19:30:16
事業仕分け、クリスマスを廃止「効果が国民に見えない」


政府の行政刷新会議(議長:鳩山首相)は13日、概算要求から無駄を洗い出す事業仕分けで「効果が国民に見えない」などとして
「クリスマス事業への予算配分を廃止する」ことを決定した。

東京・市ヶ谷の国立印刷局職員用体育館で開かれた会議の席上では、クリスマス事業を運営する独立行政法人クリスマス運営協会の担当者が
「子どもたちに夢と希望を与える重要なイベント」
「聖夜には信じられないような愛の奇跡が起きる」
と、鼻を赤くしながら熱弁をふるい総額1兆2千万円にのぼる予算の必要性を訴えた。

これに対し仕分け人側は
「子どもたちのためという美辞麗句の裏で、実際に使われている経費は大人のホテル代だのいやらしい目的のものが大半を占めるのはなぜか」
「年々イベントのはじまる時期が早くなっている。今年は10月末からムカつく宣伝を見かけるようになった」
「効果が国民に見えない。少なくとも私は去年一人クリスマスだった」
と厳しく指摘。予算の全面廃止を決めた。

これに伴い2009年のクリスマスは中止になる見込み。経済に少し詳しい評論家の池田信夫氏は
「童貞でも“もしかして…”という淡い期待とともにコンドームを買い込んでドキドキ過ごせるのがクリスマスの醍醐味。一方的にムダと断じて廃止する事業仕分けは人民裁判だ」
と批判する。とはいえ、今年末は心穏やかに過ごすことができそうだ。

10(- - ;):2009/11/19(木) 19:40:48
一見ふさけているように見えて正しいもの

while(--i)
11デフォルトの名無しさん:2009/11/19(木) 19:42:13
マナの「やさしくC」っていい?
12デフォルトの名無しさん:2009/11/19(木) 19:46:07
>>1


%dとかの%ってどういう意味ですか?
13デフォルトの名無しさん:2009/11/19(木) 19:47:06
>>11
悪くはないと思うが、ANSI C の方がいい
14デフォルトの名無しさん:2009/11/19(木) 20:01:53
typedef int (*sqlite3_callback16)(void*,int,__wchar_t**, __wchar_t**);

このようなコードを見ました。
関数ポインタ宣言にtypedefをくっつけてるのはどういった意味があるのでしょうか?
この関数ポインタ型は、ある関数にコールバック用引数として渡されていました。
その際の表記は sqlite3_callback16 xCallbackです。
15デフォルトの名無しさん:2009/11/19(木) 20:06:06
関数ポインタでもそうでなくても一緒
その型に別名を付ける
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**) の別名になる
16デフォルトの名無しさん:2009/11/19(木) 20:11:08
>>12
使用頻度が低いってこと。
17デフォルトの名無しさん:2009/11/19(木) 20:15:36
>>16

まじ?
18デフォルトの名無しさん:2009/11/19(木) 20:19:21
>>4
ポインタを使えなくてもプログラムは十分書けるだろ
19デフォルトの名無しさん:2009/11/19(木) 20:21:14
関数ポインタ分からないと、割り込み処理できねえぞ

素人は割り込みのイベントコードを見て|||||||||||||||||||||||||||||||||||||||
いったいどれくらい一行を長くするのか、ってくらい繋げるが
こんなの関数ポインタ使えばビットシフトするだけで済む。
20デフォルトの名無しさん:2009/11/19(木) 20:24:20
手前等ビットシフトを嫌ってないか。ナメてないか。

ふざけるな
タマ落としたか

ビットシフトとアセンブラはプログラマに必須である。
短いコード、速いコードを書くのがプログラマ

それを求めないやつは全部アプリコーダーである
21デフォルトの名無しさん:2009/11/19(木) 20:25:51
>15
ありがとうございます。
typedefの役割については存じていましたが、>14の表記ですと、
intの別名が(*sqlite3_callback16)(void*,int,__wchar_t**, __wchar_t**) になるのではないかと
考えていました。
22デフォルトの名無しさん:2009/11/19(木) 20:31:32
>21ですが、
ググってみるとそれらしき解説が出てきました。重ねてありがとうございました。
23デフォルトの名無しさん:2009/11/19(木) 20:49:26
%d ってどう読むんですか‥
24デフォルトの名無しさん:2009/11/19(木) 21:08:01
だんねんながら、それはパーネントディーとよみまねん。
25デフォルトの名無しさん:2009/11/19(木) 22:08:31
dllで本体のメモリのdeleteは出来ないんですか。
バグかと思って修正してもいくらやってもむりそうなんですが。
26デフォルトの名無しさん:2009/11/19(木) 22:10:58
ポインタが指しているアドレスは、関数に渡す前も、DLLでも同一なんです。
でもdeleteしたとたんに終了します
27デフォルトの名無しさん:2009/11/19(木) 22:16:09
>>20
そのとおり。
ビットシフトとアセンブラ使えば、フィボナッチ数列の1000番目だってあっという間。
28デフォルトの名無しさん:2009/11/19(木) 22:30:37
deleteって、絶対C++だろ。

>>25
一般的には無理。
割と簡単なのがnewすると同時にshared_ptrに入れて、それをやりとりすること。
shared_ptrがうまいことやってくれる。

共に同じコンパイラの同じバージョンなら、
双方で共通して使えるHeapAllocなどを使ってoperator new、operator deleteを定義するという手も可能だろうが面倒。
29デフォルトの名無しさん:2009/11/19(木) 22:53:16
Cの課題が解けなくて困ってます
ほとんど初心者なので知識がさっぱりです
助けてください

問題
入力した5個の名前を整列して表示する
やり方は名前を配列に格納した後
各配列の先頭アドレスに対するポインタ配列の要素を入れ替える整列方法

[使用ポインタ配列]

char *pt_name[5]
30デフォルトの名無しさん:2009/11/19(木) 22:54:27
すみません、さっきの続きです
ここまではできているのですが
動かなくて困っています

#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);
31デフォルトの名無しさん:2009/11/19(木) 23:03:31
&・・・?
32デフォルトの名無しさん:2009/11/19(木) 23:05:04
いろいろひどすぎてどっから突っ込めばいいかわからない
33デフォルトの名無しさん:2009/11/19(木) 23:09:45
ひどすぎるのは分かっています
それを承知でお願いしています
お願いします

ちょっと手直ししたヤツです
#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);
}
34デフォルトの名無しさん:2009/11/19(木) 23:16:10
printf("名前を5つ入力してください");
for(i=0;i<5;i++)
{
scanf("%s",name[i]);
pt_name[i] = name[i];
}
35デフォルトの名無しさん:2009/11/19(木) 23:21:04
>>29
問題の意味がよくわからん
36デフォルトの名無しさん:2009/11/19(木) 23:21:55
>>29

指定された実行結果は?
37デフォルトの名無しさん:2009/11/19(木) 23:31:41
教えてください。

以下のワーニングをとりたいんですが、どうしてもとることが出来ません。
関数の宣言の引数の型と呼び出す際の型はあっています。
(unsigned short型です)

どのような原因が考えられますでしょうか?
よろしくおねがいします。

warning: passing arg 1 of `関数名' with different width due to prototype
38デフォルトの名無しさん:2009/11/19(木) 23:33:00
ワーニング(笑)
39デフォルトの名無しさん:2009/11/19(木) 23:41:28
>関数の宣言の引数の型と呼び出す際の型はあっています。
あってないよって言ってるみたいだけど
40デフォルトの名無しさん:2009/11/19(木) 23:47:15
>>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) --


もうだめです
意味が分からなくなってきました
41デフォルトの名無しさん:2009/11/19(木) 23:52:19
>>40
5つ名前を入力して、それを順番に並べるだけでいいんだな?
42デフォルトの名無しさん:2009/11/19(木) 23:57:00
ポインタ配列を使って?
43デフォルトの名無しさん:2009/11/19(木) 23:57:26
>>41

そうです
44デフォルトの名無しさん:2009/11/19(木) 23:58:06
>>42
ポインタを使います
45デフォルトの名無しさん:2009/11/20(金) 00:04:45
こういうこと?


#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;
}
46デフォルトの名無しさん:2009/11/20(金) 00:06:09
間違えた
47デフォルトの名無しさん:2009/11/20(金) 00:15:10
# 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つの解を求めるプログラムを作成せよ。

こんな問題が出たのですが、何回やってもできません!!
どなたか教えてください
49デフォルトの名無しさん:2009/11/20(金) 00:16:05
int main (void) な・・

インデントや修正するんだぞ。。
50デフォルトの名無しさん:2009/11/20(金) 00:19:59
警告: int 型変数 vpod は一度も使われない
51デフォルトの名無しさん:2009/11/20(金) 00:21:24
>>47

ありがとうございます!!
これからは自分でできるようがんばってみます!!
52デフォルトの名無しさん:2009/11/20(金) 00:23:29
>>47

ソートが出来てなかった
strcomp使うの忘れてた
補完しといてくれ・・
53デフォルトの名無しさん:2009/11/20(金) 00:23:31
>>47
プゲラ
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;
}

こんな感じでやったんですけど出来ませんでした!!
55デフォルトの名無しさん:2009/11/20(金) 00:24:54
連投スマソ

>>51
ソートの処理は
ttp://www1.cts.ne.jp/~clab/hsample/Point/Point13.html
みてstrcmpを付け加えればおk
56デフォルトの名無しさん:2009/11/20(金) 00:35:24
2次元配列を利用して、
2進数を入力しそれから10進数、16進数にしろって課題が出されたんですが
わかりません
わかりますか?
57デフォルトの名無しさん:2009/11/20(金) 00:40:54
わかりますよ。
58デフォルトの名無しさん:2009/11/20(金) 00:41:56
二次元配列を利用する理由がわからん。
59デフォルトの名無しさん:2009/11/20(金) 00:46:47
X軸に桁、Y軸に0または1とお考えください。
60デフォルトの名無しさん:2009/11/20(金) 00:54:50
なん……だと……?
61デフォルトの名無しさん:2009/11/20(金) 01:05:47
10進数まではこうやりました
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10138.txt
何を2次元配列にすればいいかわかりません
62デフォルトの名無しさん:2009/11/20(金) 01:39:35
>54
いろいろ突っ込む所があるが
まずニュートン法を理解していない
63デフォルトの名無しさん:2009/11/20(金) 04:47:37
C言語
64デフォルトの名無しさん:2009/11/20(金) 14:39:53
malloc(0); の動作は保証されますか?
65デフォルトの名無しさん:2009/11/20(金) 14:41:23
処理系依存
66デフォルトの名無しさん:2009/11/20(金) 14:52:10
NULLを返すか0以外を指定したときと同じ動作のいずれかが
処理系で定義されてることが保証されてる
67デフォルトの名無しさん:2009/11/20(金) 17:13:32
>>64
戻り値はfreeするかreallocするしかないけどそれらの引数に使えるのは間違いない
68デフォルトの名無しさん:2009/11/20(金) 17:19:57
malloc(0)がNULLを返さなければの話
69デフォルトの名無しさん:2009/11/20(金) 17:21:01
多くの環境ではfree(NULL)は問題ないが、Windows系の場合は
それだけでオチる
70デフォルトの名無しさん:2009/11/20(金) 17:25:34
>>69 でたらめいうな。
71デフォルトの名無しさん:2009/11/20(金) 17:28:34
fclose(NULL) と混在してないか?
72デフォルトの名無しさん:2009/11/20(金) 17:29:09
free関数は,ptrが指す領域を解放し,その後の割付けに使用できるようにする。
ptrが空ポインタの場合,何もしない。
73デフォルトの名無しさん:2009/11/20(金) 17:47:38
>>70
おちるね。特に古いWindowsでは。
74デフォルトの名無しさん:2009/11/20(金) 18:22:20
何もしなくても落ちるしね
75デフォルトの名無しさん:2009/11/20(金) 18:29:53
>>73
いつの話してんだお前は。
古いシステム持ち出すなら、HP-UX だって落ちてたわい。
76デフォルトの名無しさん:2009/11/20(金) 18:55:22
>>73
うそをいうな。 MS-C 5.10 の頃にはすでに free(0) は no operation になっている。
77デフォルトの名無しさん:2009/11/20(金) 19:10:16
ヌルポをフリーしたら落ちるってのは常識だろ
78デフォルトの名無しさん:2009/11/20(金) 19:11:35
NULLにしとけば落ちないっていうのが、標準動作だが。
メモリ操作するときのポインタはNULLクリアしとけっていった。
79デフォルトの名無しさん:2009/11/20(金) 19:26:06
C++ delete NULL; //OK
C free(NULL); //基本的にはOKな方向なんだが、
古いライブラリではそうとも限らないので、こういうつまらんことが原因で古いライブラリな処理系で動作しないことがないように
freeする前にNULLかどうかチェックしてから行ってあげて
80デフォルトの名無しさん:2009/11/20(金) 19:27:06
ANSI及びISOではfree(NULL)は何もしない。JISでは落ちるのかもね。
81デフォルトの名無しさん:2009/11/20(金) 19:33:27
そもそも free(ptr); の時点で
ptr == NULL なのがプログラムの設計として
まずい兆候なんだが
規格でどーこー言う前に
82デフォルトの名無しさん:2009/11/20(金) 19:35:14
そういうこともある。一度目に訪れたときは、メモリ確保してないときなどがある。
確保したのかしてないのか不明の場合もあり得る。
83デフォルトの名無しさん:2009/11/20(金) 19:39:34
>ptr == NULL なのがプログラムの設計としてまずい兆候なんだが

だれからそんな妄想を習ったのだ。
そもそもCのfreeやC++のdeleteがなぜぬるぽの時何もしない仕様になったかといえば
ぬるぽの時にわざわざ分岐を書かなくてすむという現場の要請があったからなのだ。
84デフォルトの名無しさん:2009/11/20(金) 19:47:21
分岐の必要性が出る背景をまずい兆候と言ったんだが
それが絶対ダメとか聞こえる耳なら他からも変な妄想をいっぱい貰ってそうな「まずい兆候」だな
85デフォルトの名無しさん:2009/11/20(金) 19:49:35
>分岐の必要性が出る背景をまずい兆候

だれからそんな妄想を(以下略)。
Effective C++でさえ、普通に delete 0 やってるぞ?ん?
それともお前の読んでいる本では「まずい兆候」なのか?
86デフォルトの名無しさん:2009/11/20(金) 19:52:42
とりあえず>>83は「まずい兆候」って書いてある教科書をさらすべきだろう
そうすればみんな納得^^
87デフォルトの名無しさん:2009/11/20(金) 19:54:05
あ、>>84の間違いだったスマンコ^^
88デフォルトの名無しさん:2009/11/20(金) 20:01:12
おまえらよー
誰かから習ったり、本から読んだって前提はどこから出てきた?

この時点でものすごく「まずい兆候」をおまえらに感じるぞ
89デフォルトの名無しさん:2009/11/20(金) 20:03:49
いやいや、自分は後学のために

>そもそも free(ptr); の時点で
>ptr == NULL なのがプログラムの設計として
>まずい兆候なんだが

となる具体的な事例を知りたいだけですよ^^
別にあなたの意見を否定はしていませんです
むしろよろしくお願いしますと頭を下げる勢いm^^m
90デフォルトの名無しさん:2009/11/20(金) 20:07:09
2重free?になるような状況を言ってるんじゃ
91デフォルトの名無しさん:2009/11/20(金) 20:09:37
具体的な事例を1つも知らん者に
ここで具体例を示すことに価値を感じない

頭が悪すぎるのか、そんな段階ではないのか、いずれにしてもね
92デフォルトの名無しさん:2009/11/20(金) 20:13:23
あらら…「入門編」のスレでそれですか。^^;

もしかして、知らないだけでしょ? ^m^クスクス
93デフォルトの名無しさん:2009/11/20(金) 20:14:44
このあと必死の弁解↓
94デフォルトの名無しさん:2009/11/20(金) 20:25:14
入門編のスレにきて
お前ら頭が悪すぎる、そんなものに教える価値は感じない

何しにきてるんだろう?
95デフォルトの名無しさん:2009/11/20(金) 20:28:17
何か書いたとして、それを絶対ダメと読まれかねない状況が「入門編」のスレで起きているわけだが
96デフォルトの名無しさん:2009/11/20(金) 21:01:50
俺は正しい、間違ってるのはお前ら。
証拠はないけどこれは事実。

こういう考えなんだろ
97デフォルトの名無しさん:2009/11/20(金) 21:44:11
「絶対ダメと読まれかねない状況」とかどんな妄想?
誰もそんなこと書いてないのに。
98デフォルトの名無しさん:2009/11/20(金) 21:46:09
とんち勝負はもういいよ
99デフォルトの名無しさん:2009/11/20(金) 21:51:11
ダブルポインタはアドレスのアドレスでいいの?
100デフォルトの名無しさん:2009/11/20(金) 21:58:10
アドレスのアドレスは変。
アドレスを指し示す変数のアドレスだろ。
101デフォルトの名無しさん:2009/11/20(金) 22:04:10
int型は整数は変。
整数を入れておくための変数だろ
みたいな言い方だな
102デフォルトの名無しさん:2009/11/20(金) 22:17:37
内容と入れ物は分けよう
103デフォルトの名無しさん:2009/11/20(金) 22:20:10
char **pは、アドレスを指し示す変数のアドレスを指し示す変数だな。
pの内容は、アドレスを指し示す変数のアドレスだな。
104デフォルトの名無しさん:2009/11/20(金) 22:21:51
こまかいやつらだなーwww
こういうのが回りにいたらうざすぎるwwwwwww
105デフォルトの名無しさん:2009/11/20(金) 22:28:03
>>104wwwwwwwwwww
職場にいたらうざすぎるwwwwwwwwwww
106デフォルトの名無しさん:2009/11/20(金) 22:31:08
プログラム書くのに細かくない奴はダメだろ・・・
107デフォルトの名無しさん:2009/11/20(金) 22:31:32
途中に変数が入ることが大事だろ。
アドレスのアドレス、はあり得ない。

アドレスの入ってる変数のアドレス、はあり得る。
108デフォルトの名無しさん:2009/11/20(金) 22:48:01
日常でも
たとえば
〜〜それ以上でも以下でもない
とかいう決まり文句に対して
以上でも以下でもないなんてことはありえない!

とかいちいちいってそう。キモッ
109デフォルトの名無しさん:2009/11/20(金) 22:57:23
「現場の要請」の現場がどこなのか知っていて、
「まずい兆候」を妄想と言い切った
おまけに教員か本しか情報源が思い当たらない
決定打で他の人がヒントっぽいことを書いてくれているのが通じていない

どこの現場のためか知らんが、こーゆーバカの矯正をぶっ叩けないところからボランティアでやれって?
お断りだ、何を言っても変に妄想されるだけで草臥れ儲けだからな

# スレ違いだが delete に new が返したものではない値(しかも整数)を平気で書ける神経が全く理解しがたい
# それこそどこの本に書いてあったのか、誰に習ったのか、謎なんだが
110デフォルトの名無しさん:2009/11/20(金) 22:57:46
宇宙って膨張しているんでしょ?
じゃあどうして僕たちは膨張しないの? 教えてせんせー
111デフォルトの名無しさん:2009/11/20(金) 23:00:09
宇宙じゃないから
112デフォルトの名無しさん:2009/11/20(金) 23:00:47
>>111
この空間、僕たち全ては宇宙にある物質だよね?
ちがうの?
113デフォルトの名無しさん:2009/11/20(金) 23:01:56
宇宙は膨張してる
俺らも膨張してる

ただ俺らの体は宇宙に比べてものすごい小さいから感じないだけ。
あと何十億年もたったら物質は膨張しすぎてバラバラになるよ
114デフォルトの名無しさん:2009/11/20(金) 23:03:01
>>113
そうなんだー!
でも数十億年先は、僕は生きていないからどうでもいいや。
ありがとう。
115デフォルトの名無しさん:2009/11/20(金) 23:18:22
C言語はいちいちコンパイラとか手に入れなきゃならんの?
Windowsに標準で入ってないの?
116デフォルトの名無しさん:2009/11/20(金) 23:20:31
codepadってサイトにいってごらん
コンパイラいらずだよ
まったくいい世の中になったもんだ
117デフォルトの名無しさん:2009/11/20(金) 23:30:41
おーありがとう
ちょっとしたことやりたいだけなのに
フォルダの中が.hだか.cだかくだらんテキストファイルとexeで埋め尽くされなくてもテストできて便利だの
118デフォルトの名無しさん:2009/11/20(金) 23:33:39
はじめから使える言語
wsh jscript
119デフォルトの名無しさん:2009/11/20(金) 23:34:47
>>116
ファイル操作とかしないのか?
120デフォルトの名無しさん:2009/11/20(金) 23:40:31
学校の課題とかで電卓機能程度にしか使わないんじゃね
121デフォルトの名無しさん:2009/11/20(金) 23:44:22
codepadなんて、ちょっと出力増えるだけで使えなくなるだろw
122デフォルトの名無しさん:2009/11/20(金) 23:59:04
>>109
で、なんでそんな上から目線で回答しないやつが入門編スレにいるの?
バカなの?死ぬの?
123デフォルトの名無しさん:2009/11/21(土) 00:01:32
知識のない初心者をあざ笑うくらいしか人生にやることがないんだろう
それもわざわざageてまで
124デフォルトの名無しさん:2009/11/21(土) 00:15:56
このスレにいる連中

初心者質問者なのにやたら偉そうなやつ
やたら細かくてどうでもいいことまで指摘しないと気がすまないやつ
入門スレだから初心者が多いと思われる他人をバカにして楽しむやつ
ただ質問に答えまくるロボットくん
宇宙の話とかプログラミングやC言語とはほとんど関係ない話をしたがるやつ
123みたいなメタバカ
125デフォルトの名無しさん:2009/11/21(土) 00:17:54
>>124
一つ抜け落ちているぞ
126デフォルトの名無しさん:2009/11/21(土) 00:20:12
OSの作り方教えてください
127デフォルトの名無しさん:2009/11/21(土) 00:20:37
printf("OS");
128デフォルトの名無しさん:2009/11/21(土) 00:22:03
そういう本が出版されてるからそれ読め
129デフォルトの名無しさん:2009/11/21(土) 00:22:14
>>126
OS の定義

話はそれからだな。
130デフォルトの名無しさん:2009/11/21(土) 00:22:59
Onanii Saikou
131デフォルトの名無しさん:2009/11/21(土) 01:01:15
C言語は構造つかうときに
いちいちstructって書かないとダメで冗長でめんどくさいな。
C++のほうが良いな。
132デフォルトの名無しさん:2009/11/21(土) 01:05:08

typedef
133デフォルトの名無しさん:2009/11/21(土) 01:05:29
>131
つtypedef
134デフォルトの名無しさん:2009/11/21(土) 01:09:52
mallocで確保したメモリ領域って
freeで開放しなかったらどうなんの?
アプリケーションが終了してもそのメモリ領域は使用不能になるの?
135デフォルトの名無しさん:2009/11/21(土) 01:13:23
処理系依存
136デフォルトの名無しさん:2009/11/21(土) 01:17:03
>アプリケーションが終了してもそのメモリ領域は使用不能

へぼOSではあり得るかもしれんが、実物は知らない。
137デフォルトの名無しさん:2009/11/21(土) 01:21:16
>>134
アプリの責任範囲外
138デフォルトの名無しさん:2009/11/21(土) 02:23:18
NULL ポインタfreeが古い処理系じゃまずかった理由?
一部の古い処理系ではNULLは定数ではなくmalloc書き込み専用変数
だった。(一般は参照のみ可)
古い話なんで細かいことは省略するが、プログラムのモジュール通信
の為だけに特権的な値を設定することなど貴重なアドレス空間の無駄
遣いでタブーという時代の要請としておく
freeはNULLを参照しないで機械的にブロック解放を行うので
間違った値を与えると確実にヒープを壊しプログラムは早晩落ちた。
139デフォルトの名無しさん:2009/11/21(土) 02:47:26
ごめん、
> malloc書き込み専用変数
すらわけわからん。
140デフォルトの名無しさん:2009/11/21(土) 03:00:05
>>138
昔のシステムはヒープが空になったタイミングで拡張/縮小の
為に移動しなければならなかったりとかいろいろと複雑な
ものがあったね。こういった場合はNULL値の定義は難しい。
141デフォルトの名無しさん:2009/11/21(土) 03:18:48
三次元配列=ウンコ
142デフォルトの名無しさん:2009/11/21(土) 05:52:09
CではNULLは完全な市民権を得ているというわけではないみたいw
ハードウェアに近い低レベル処理を記述する場合はいろいろと注意が
必要なのかも
けど新しめな環境やOS上のプログラミングでは多分完全OK
C++では予約語では無いみたいだが、主導権すら得ているし
完全にスレ違いではあるがJavaではnull無しではプログラムに
ならないくらいの重要な予約語だし
こういう理解でいいのかな?
143デフォルトの名無しさん:2009/11/21(土) 07:39:48
nullポインタ定数、nullポインタ値、NULLマクロは全部別物。
多分とかかもとか言ってないで、規格票よみゃいいだけ。
144デフォルトの名無しさん:2009/11/21(土) 10:37:00
NULL は C でも予約語ではないし、
nullポインタなんて用語は規格票を読んでも登場しない

低レベル処理では 0 番地に何かあり、そこを指し示すポインタを有効なポインタとして使う場合がある
しかし、そこでも NULL は 0 だ

メモリコンパクションは、それが起きる機会と、その機会を経たポインタを更新する方法が明確化されているが
そのような環境でも NULL は 0 で十分に機能していた

空ポインタのビット列が 0 でない処理系は実在したらしいが、俺はその時代を生きていないので
昨晩のバカのように本から読んだことしか語れない
# C++ ではどっこい現役だけどね
145デフォルトの名無しさん:2009/11/21(土) 14:42:07
Intelプロセッサのi386系列の場合アドレスはセレクタに
書かれてるベースアドレスからの相対アドレスだから
その上のC言語においてNULLをmallocの無効アドレス
戻り値として解釈定義する限り0は不合理とまでは
言わないが、大抵の場合例えば-1(0xFFFFFFFF)とか
負の整数で定義するほうが、CPUのせっかくの保護
機能を生かせることになる。
146デフォルトの名無しさん:2009/11/21(土) 15:06:33
147デフォルトの名無しさん:2009/11/21(土) 15:08:36
CPUの例外とかではなくて
言語としてNULLはリターンするとかの決まりだろ。
148デフォルトの名無しさん:2009/11/21(土) 15:12:14
>145
何いってんだか
null constantは0または(void *)0だよ
149デフォルトの名無しさん:2009/11/21(土) 15:43:11
構造体の配列をループさせたいのですが、どうやるのが適当でしょうか。

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)で配列の要素数を求めることも出来ますが
納得できません。
よろしくお願いします。
150デフォルトの名無しさん:2009/11/21(土) 15:45:51
すみません(汗

list++ ではなく st++ の間違えです。
脳内変換お願いします。
151デフォルトの名無しさん:2009/11/21(土) 15:48:37
安全やるなら、STL vectorに入れとけよ
152デフォルトの名無しさん:2009/11/21(土) 15:51:17
>>151
すみません、誤爆しました。
C言語のスレだと思っていました。移動します。
153デフォルトの名無しさん:2009/11/21(土) 15:58:34
すみません、C言語の質問スレってどこにあるのですか?
154デフォルトの名無しさん:2009/11/21(土) 16:00:22
あれ?
ここC言語の質問すれだ(笑)

ところで STL Vector って何ですかね。
検索しても C++ しか出てこない(C++は未経験)
Cにも STL Vector ってあるのでしょうか。
155デフォルトの名無しさん:2009/11/21(土) 16:07:09


cstl-0.6.2.zip
156デフォルトの名無しさん:2009/11/21(土) 16:19:16
自分で作れよ自己参照構造体使えばできるだろそれがC使いの生き方
157デフォルトの名無しさん:2009/11/21(土) 16:27:00
>>156
自己参照構造体とは何ぞや?
と思って調べたら連結リストで使うものですか。

実は、自分の書いたコードではなく、オープンソースプログラムを改編しているのです。
配列でデータ構造が表現されているので、それに従うしかありません。
ちなみに、僕は、あまりC使いな人ではありません。

で、ライブラリ関数とか見てみると、番兵法使っているものも結構あるのでこのままでいこうと思います。
ありがとうございました。
158デフォルトの名無しさん:2009/11/21(土) 16:39:06
struct P{
P *p;
}

ってやつか
159デフォルトの名無しさん:2009/11/21(土) 16:52:58
構造体じゃない配列はどうやってんだよ?
同じようにやれば良いだろ。
160デフォルトの名無しさん:2009/11/21(土) 16:54:19
スタックコールについて聞きたいんですが
ボードゲームのAIについて勉強していて、ゲーム木とα-β法というアルゴリズムを利用しているのですが
ソースコード内に特にランダムな値を利用しているわけではないのにプログラム同士の対戦結果が毎回違うのに悩んでいました。
勝手な予想ですが、おそらくゲーム木を再帰的に探索する途中に探索する順序が違うとα-β法によりゲーム木のサブツリーのカットの仕方が違うため違う結果がでるのではないかと考えました。
そこで、探索する順序を一定にするためにスタックコールで呼び出す関数の順序を設定したいのですが、C言語でそのような操作はできるのでしょうか?
161デフォルトの名無しさん:2009/11/21(土) 17:11:18
>>160
ツリーをたどるときに、どの枝をたどっているかを出力させればいいだけじゃね?
カットする時にも、どの枝をカットしたかを(評価関数の出力も含めて)出せばいい。

ちなみに、シングルスレッドで組んでいるのなら毎回結果が違うのはバグであるとしか思えない。
初期化されていない変数使ったとか、バッファオーバーランしたとかの。
162デフォルトの名無しさん:2009/11/21(土) 17:14:21
探索する順序を一定にするには、スタックコールなど使わなくてもプログラム側で決まった順に探索するようにすればいい。
(そもそもランダムな順序で探索するようにはしてないと思うけど)
163デフォルトの名無しさん:2009/11/21(土) 17:26:22
>>144
はやく死ねよ
164デフォルトの名無しさん:2009/11/21(土) 17:29:14
レスありがとうございます。
シングルスレッドなのですがフリーのチェスプログラムなので恐らくバグではないと思います。
ランダム以外で違う出力になる要因て他に何かあるのでしょうか?
情報が少ないので答え難いとおもいますが
こちらから出してほしい情報がありましたらなんでも聞いてください
165デフォルトの名無しさん:2009/11/21(土) 17:41:54
最適手の検索を時間で打ち切ってるとか。
それなら負荷状態によっても結果が変わる。
166デフォルトの名無しさん:2009/11/21(土) 17:42:13
フリーのチェスプログラムのソースがあれば、誰か解析してくれるんじゃね?
167デフォルトの名無しさん:2009/11/21(土) 17:44:08
自分もそう思って探索深度を低くして探索時間を長時間にしてタイムオーバーでの探索打ち切りが行われないようにしたつもりですが、他にも打ち切りの条件があるのかもしれないので、もう少し調べてみます。
168デフォルトの名無しさん:2009/11/21(土) 17:45:07
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になりました。
170デフォルトの名無しさん:2009/11/21(土) 19:03:51
キリのいいサイズのほうが扱いやすいので勝手に構造体に詰め物をしてもいい
このへんは環境依存
171デフォルトの名無しさん:2009/11/21(土) 19:04:46
環境依存な言語つくるなよksg
172デフォルトの名無しさん:2009/11/21(土) 19:10:13
てことは、効率を犠牲にして実装までガチガチに定めてしまうん?
173デフォルトの名無しさん:2009/11/21(土) 19:15:19
いやならほかの言語使えよksg
174toya:2009/11/21(土) 20:11:18
http://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E
このサイトもテンプレ入れてくれないか。
できれば編集も手伝ってくれ。
175デフォルトの名無しさん:2009/11/21(土) 20:12:29
>>171
悪かったな
アセンブラ作ってるよ
176デフォルトの名無しさん:2009/11/21(土) 21:12:41
醜い
177デフォルトの名無しさん:2009/11/21(土) 22:12:00
>>175
キモ
178デフォルトの名無しさん:2009/11/22(日) 03:56:55
独学で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なんとか読み取ってくださると幸いです。
179デフォルトの名無しさん:2009/11/22(日) 04:00:39
インデントのないソースは見ないことになっている
180デフォルトの名無しさん:2009/11/22(日) 04:11:32
1.nxは来ない。~0Uが来る。
2.継続条件はxが非ゼロ。逆に言えばxがゼロにるのが終了条件。
3.xに入ってる数を2進法で表したときの1の数をが返される。0から32のいずれかの数。
4.うん。
181デフォルトの名無しさん:2009/11/22(日) 05:29:24
コンソール画面の文字全部消すことってできないの?
182デフォルトの名無しさん:2009/11/22(日) 05:36:17
できる
183デフォルトの名無しさん:2009/11/22(日) 05:38:19
>>181
きっとできる。液晶ディスプレイめがけて
適当な重いものを思いっきり投げつけるんだ
バットでも、バイルでもいい
184デフォルトの名無しさん:2009/11/22(日) 05:41:11
>>181
業界標準の方法
printf("%c[2J",0x1b)
これでうまくいかなかったら
マニュアルなり資料なり参照しなければムリ
もしかして出来ない場合もあるかも
185178: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');
}


理解力がなく大変申し訳ない。すみませんがもう少しおつきあいください。
186デフォルトの名無しさん:2009/11/22(日) 11:47:47
int_bitsまわりは、unsignedのビット数を割り出してるだけだよ
環境によっては,unsignedが16bitとかの時もあるし
187デフォルトの名無しさん:2009/11/22(日) 12:17:49
>>181
cls
188デフォルトの名無しさん:2009/11/22(日) 12:19:25
>>187
バッチファイルww
189デフォルトの名無しさん:2009/11/22(日) 12:28:24
C++のクラスを作り始めて3ヶ月です。
Stringクラスを作っています。
関数や演算子は色々と省いてありますが、
このコードについて批評をお願いします。
190189: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);
  }
};
191189: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インスタンスを値型で返しているのですが・・・
オーバーヘッドとかはどうなんでしょうか。

設計的問題、凡ミス、ハァ?なこと、
どんなことでもいいので指導してください。お願いします。
192デフォルトの名無しさん:2009/11/22(日) 12:35:17
>>181
#<stdlib.h>
system("cls");



#<conio.h>
clrscr();

かな。
193189:2009/11/22(日) 12:41:00
ちなみにVC++2008です
194デフォルトの名無しさん:2009/11/22(日) 12:44:36
>>191
クラス名は WString とかにしたほうがいいんじゃない?
wchar用のstringクラスを作りたかったんだよね

SubString()は、引数のエラーチェックをしたほうがいい
マイナスとかMAXINTは指定されたくないでしょう
195デフォルトの名無しさん:2009/11/22(日) 12:51:23

           ,.――   、
            //       \\
.          / ./        \\
      /  ′  ,. -―――- 、  \           % %ェ %%%%%■%%〓%%ャ %ェ … .
      \  :! /: :/l ∧: : :∧: ヘ\/        .%%■% %ェ  %¨ ∵% %ェ ・
.          \|/: :W 廴__,\/、__ノ:Y     %% %%%% ¨%%%%%%%■■〓%%%%
         / |:r|: | r=ミ  r=ミl:|      %%%%%%%%%■〓%% %% ∴ %ェ .
.      _/: : :{.|: | xxx   ' xxx リ  %%%%%%%%%%% %ェ ∴ ….%   %%
..  __,/: :_:./:/:ハ:ゝ     )%%%%%%%%%%%%%%%  %ェ %%%%%
.. |: : : : :/__ /:/:/: \`ヘー一ァ::i"|Y:\      ¨ %%%■%%% %ェ ∴‥
196デフォルトの名無しさん:2009/11/22(日) 12:56:47
Linuxのインストール中のコンソールの画面で表示される文字が流れずにキャレットは左下の位置に固定されてて
最下行の文字列だけ書き換わるような表示ってどうやったらできるんですか。
>■インストール中 ===->      [69%]
みたいな。
197デフォルトの名無しさん:2009/11/22(日) 13:01:13
>196

Linuxならcursesでググってみて。

環境依存OKスレがオーバーフローしているけど、誰かnewしないかな。
198デフォルトの名無しさん:2009/11/22(日) 13:13:53
環境依存OKスレのオーバーフローでC言語入門スレが破壊されますた
199189:2009/11/22(日) 13:22:33
>>194
ありがとうございます。
あと、Substringの戻り値なんですが、あのまま戻しても問題ないですよね?
200デフォルトの名無しさん:2009/11/22(日) 13:41:52
>>196
'\r'
201デフォルトの名無しさん:2009/11/22(日) 13:47:54
>>196
たいていの場合、^H(0x08)で1文字戻すか、
^M(0x0d)で行頭に戻しているだけ

cursesとかtermcapとかは、正しく端末設定されて、かつ
設定ファイルが揃ってないと使えないので、OS起動時とかは
決め打ちでやることが多い
202デフォルトの名無しさん:2009/11/22(日) 13:54:19
>>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
203デフォルトの名無しさん:2009/11/22(日) 13:57:09
バッチファイル現るw

linuxって言ってんのに
204デフォルトの名無しさん:2009/11/22(日) 16:05:33
>>197
立てたよ

【初心者歓迎】C/C++室 Ver.70【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1258873470/l50
205デフォルトの名無しさん:2009/11/23(月) 00:44:20
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);
}
}
}
206デフォルトの名無しさん:2009/11/23(月) 00:52:30
上記のソースは絶対パスと規則的なナンバーがついた
UNICODEの単語x.txtファイルを順に開いていくプログラムですが
fp3のポインターによりそれぞれの定型処理で、ストリームを
開いていってもFILE型で宣言が無意味なぐらい
爆発的に伸びる階数のように不規則な動きをします。
207デフォルトの名無しさん:2009/11/23(月) 00:55:20
駄文で申しわけありませんが

ご指南の方をよろしくお願いします
208デフォルトの名無しさん:2009/11/23(月) 01:01:33
>>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));
209デフォルトの名無しさん:2009/11/23(月) 01:32:10
>>208
そうした方が見やすいといえば見やすいですね。

基本的に難しく書こうが、優しい書こうがfopen_s関数の
第一引数はなぜ二次ポインターになってるいるのか
謎が深まるばかりです。その理由は、一次ポインターや
二次ポインターなどマドろこしい理論は置いといて
fcloseやfflushしても、fopen_sでストリームを
複数回開くとまるでゴミのようなバファが出力されてきます。
それは元を辿れば自分がテキストファイルにより出力された物には
違いありませんが、まるで関数作成者のフラストレーションを
吐き出すかのようなオナニークラスです。正直データとして扱かえれません。
ちなみにいい忘れましたが、私の処理系はWINDOWS7で
Visual Studio 2009を使ってます。私の直感ですが、このfopen_sの
二次ポインターは関数ポインターで受け渡すか、FILEポインターで引き渡す
Elmentではないかのどちらかだと思います。いずれにしよ、一つ一つの
処理単位が違うと感じました。
210デフォルトの名無しさん:2009/11/23(月) 01:38:31
戻り値のエラー情報積極的に使えってことだろ。
211デフォルトの名無しさん:2009/11/23(月) 01:40:09
>>209
fopen_s(FILE** pFile, ...)になっているのは、そうしないと FILE* の
変数を更新できないから。

本当は成否のerrno_tとFILE*の2つの値を返したいけど、Cではそういう
ことはできないので片方をポインタにしてパラメータに置いている。

212デフォルトの名無しさん:2009/11/23(月) 01:40:52
つーか、根本的に解ってないんじゃね?
そう不思議な仕様でもないだろ。
渡すためじゃなくて受け取るためだからアドレス参照渡しなんだぞ?
213デフォルトの名無しさん:2009/11/23(月) 01:43:19
>>205
関数内で FILE* file[] ってあるのに、fopen_s() に渡しているのは
fp3[i] だったりしてあやしい。
214デフォルトの名無しさん:2009/11/23(月) 03:37:15
なんで配列って[0]から始まるんだろう。
int a[10]ってやったら
a[10]はないとかわかりづらい。

[1]からはじまればいいのに。
215デフォルトの名無しさん:2009/11/23(月) 04:13:44
満年齢と数え年の違いみたいなもんだ。
216デフォルトの名無しさん:2009/11/23(月) 04:27:40
>>214
それが嫌なら OPTION BASE 1 を指定してVBでも使ってろってこった
217デフォルトの名無しさん:2009/11/23(月) 05:53:27
ろくに勉強しないで長い感想文ばっかり書いてる奴は
そういうのが誉められる世界へ行けよ
218デフォルトの名無しさん:2009/11/23(月) 08:12:31
>>213
すいません。
if( (err= fopen_s(&fp3[i],p2, "rb,ccs=UNICODE" ))!=0)
じゃなくて・・・ ↑
if( (err= fopen_s(&file[i],p2, "rb,ccs=UNICODE" ))!=0)
ですよ。ソースからコピペする時にミスりました

テヘ
219デフォルトの名無しさん:2009/11/23(月) 08:25:20
>>212
アドレスの参照渡しですか!!!
fopen_s()が二次ポインターを要求してるから
三次ポインターを使えって事ですかw俺はC言語
仙人じゃないので判りません。ちなみに、マドロこしいの
嫌いだからFILE *file[MAXSIZE]は2ch転機上は
openstream()内で宣言してますが
実際に使うときはグローバル変数で使ってました。
三次元ポインターとか、敷居の高いことできるなんてさすが
C言語の世界を極めてた人は違いますね
220デフォルトの名無しさん:2009/11/23(月) 08:59:51
うぜえ
221デフォルトの名無しさん:2009/11/23(月) 09:35:57
ポインタの敷居が高いと感じるなら適性が無いと言う事。
早々に見切りをつけて別の道を行った方が良い。
222デフォルトの名無しさん:2009/11/23(月) 09:38:31
ポインターなんて
int x;
int *p;
p=&x;

三次元だろうが参照だろうが全部これをちょっと形変えただけじゃん。
223デフォルトの名無しさん:2009/11/23(月) 09:56:17
>>222
おまえ分かってないだろww
224デフォルトの名無しさん:2009/11/23(月) 11:42:09
*p
pのポインタ

**p
pのポインタのポインタ

***p
pのポインタのポインタのポインタ

何が難しいんだか
225デフォルトの名無しさん:2009/11/23(月) 11:47:24
配列?に置き換えれば、少しはわかるかも
226デフォルトの名無しさん:2009/11/23(月) 11:52:58
わかりやすいポインタ講座

アドレス10000に書いてました
xをみつけたいならアドレス20000を見ろ

アドレス20000に書いてました
xをみつけたいならアドレス30000を見ろ

アドレス30000に書いてました
xをみつけたいならアドレス40000を見ろ

アドレス40000に書いてました
xの値は0xABCDです。
227デフォルトの名無しさん:2009/11/23(月) 11:55:37
よくある間違いは領域確保してませんでしたって奴じゃろ
228デフォルトの名無しさん:2009/11/23(月) 12:02:01
理解していても領域確保を忘れる事は往々にしてあるが、間違い以前に「理解できない」らしい。

なんで理解できないのかは理解できないが、きっと適性が無いのだろう。
229デフォルトの名無しさん:2009/11/23(月) 12:13:03
>>224
おまえ解ってないじゃんw
230デフォルトの名無しさん:2009/11/23(月) 13:57:14
ポインタ自体はコンパイル時にサイズを情報として持ってるだけで難しくは無いけど
文法の法則性を理解するまでが小難しいんだよね
231デフォルトの名無しさん:2009/11/23(月) 14:04:53
自己参照型構造体でリストを作ったときに、初めてポインタとtypedefが理解できた
232デフォルトの名無しさん:2009/11/23(月) 14:16:04
リストはポインタの勉強になるよね
車輪の再発明がどうのこうの言ってないで一回はやっとくべき
233デフォルトの名無しさん:2009/11/23(月) 14:29:15
車輪の再発明って?
言語も大事だけど、アルゴリズム(とデータ構造)はもっと大事だから勉強し
234デフォルトの名無しさん:2009/11/23(月) 15:26:36
「車輪の再発明」って言葉の意味を勘違いしてるヤツ多いよな。
235デフォルトの名無しさん:2009/11/23(月) 15:58:10
ポインタとかけて車輪と解く その心は?

どちらも頭から入らず、先ず慣れ親しんだほうが(経験則を多数集めたデータベースを作る)上達は早い
どちらも真の理解は非常に難しい。
236デフォルトの名無しさん:2009/11/23(月) 16:16:59
真の理解ってなんだよw
237デフォルトの名無しさん:2009/11/23(月) 16:36:16
車輪・・・??
238デフォルトの名無しさん:2009/11/23(月) 17:27:06
C言語ってちょっと応用すれば
ただのint型をメモリアドレスを入れておく変数として使えるな。

その辺のプログラミング言語だとこんなに簡単にメモリアドレス使えないな。
Cは便利だな
239デフォルトの名無しさん:2009/11/23(月) 18:03:46
>>223
判断の材料が不足しており、これだけではなんとも。
240デフォルトの名無しさん:2009/11/23(月) 18:05:14
>>238
それは環境依存。その昔は sizeof(int)
241デフォルトの名無しさん:2009/11/23(月) 18:06:01
sizeof(int) != sizeof(int *)

な環境もあった。MS-DOS の far とか。
242デフォルトの名無しさん:2009/11/23(月) 18:09:35
今時の64ビット環境もそうだよね。だいたい、LP64かLLP64だし。
もちろん、今ならintptr_t/uintptr_tがあるんだけど。
243デフォルトの名無しさん:2009/11/23(月) 18:52:26
6502 の int型は何ビットだ?
アキュムレータが8ビットだから8かな?
アドレスは16ビット使えたよな?
244デフォルトの名無しさん:2009/11/23(月) 19:34:12
8086のセグメントモデルもそうだけど、ポインタが整数にキャストできるか
どうかは保証できないよね

昔のワードマシンでは、バイトアドレスを指すために
ポインタは2つのデータ(ワードアドレスとオフセット)で出来てたらしいし
245デフォルトの名無しさん:2009/11/23(月) 19:39:54
ポインタがあるんだからよっぽど特殊な環境じゃなきゃ素直にそれを使えばいいんだよ。
246デフォルトの名無しさん:2009/11/23(月) 19:44:14
そりゃそうだ

でも mmap の返り値がエラーかどうか判定する場合みたいに
なんか気持ち悪いこともあるよね
247デフォルトの名無しさん:2009/11/23(月) 19:52:47
単にアドレスを入れておきたいならvoid *、
メモリを1バイトずつアクセスしたいならchar *、
他の言語とやり取りするなら十分なサイズの整数型…

便利。
248デフォルトの名無しさん:2009/11/23(月) 20:27:37
文字の比較についてやってるんだけど
その文字列が10000まであって
プロンプトにコピペすると500くらいで入力できなくなる

どうしたらいい?
249デフォルトの名無しさん:2009/11/23(月) 20:31:03
それはC言語には関係ないな。
250デフォルトの名無しさん:2009/11/23(月) 20:32:23
標準入力を使う
251デフォルトの名無しさん:2009/11/23(月) 20:35:06
ファイルでもおk
252デフォルトの名無しさん:2009/11/23(月) 20:47:12
バッファサイズを増やせばいいだろボケ
そんなこともわかんねのかよ?
253デフォルトの名無しさん:2009/11/23(月) 21:18:41
環境によっては増やせんでしょ
254デフォルトの名無しさん:2009/11/23(月) 21:43:58
リダイレクションで解決しました
255デフォルトの名無しさん:2009/11/23(月) 23:38:34
>>186
返事遅れて本当に申し訳ございません
ありがとうございます。
int int_bits(void)
{
return(count_bits(~0U));
}
のどこにunsignedのビット数を割り出す要素があるのでしょうか?あとここだけなのでどうかおしえていただけないでしょうか
お願いします
256デフォルトの名無しさん:2009/11/24(火) 00:15:35
>>255
count_bitsでunsignedのビット数を数えてるでしょ
257デフォルトの名無しさん:2009/11/24(火) 00:17:47
0Uの反転でALL1にしてるのがミソ?
258デフォルトの名無しさん:2009/11/24(火) 00:31:51
ポインタは、アドレスだけでなく、サイズも持っている。
たとえば
int x=10;としてintのサイズが4バイトであるとして
xが12345678というアドレスにあるなら
&xは12345678、12345679、1234567A、1234567B
の4つのアドレスを保存する。
実はポインタとはアドレスの配列だったのである。
259デフォルトの名無しさん:2009/11/24(火) 00:42:50
はぁ?
寝言は寝て言ってくれないか
260デフォルトの名無しさん:2009/11/24(火) 00:58:47
なんでC言語って不必要なくらいたくさんの数字の型があるんだ?
261デフォルトの名無しさん:2009/11/24(火) 01:01:16
>>260
必要ないなら使わなくてもいいんだぜ
262デフォルトの名無しさん:2009/11/24(火) 01:06:07
関数ポインタの表記法は複雑すぎる。もっとすっきり出来なかったのかね。
263デフォルトの名無しさん:2009/11/24(火) 01:07:17
char, int, float, doubleの4つだろ
ああ、C99の話か
264デフォルトの名無しさん:2009/11/24(火) 01:11:35
>>263
それは少なすぎだって
265デフォルトの名無しさん:2009/11/24(火) 01:13:29
サイズ情報はコンパイラのためのものだな。
266デフォルトの名無しさん:2009/11/24(火) 01:15:59
基本型は char と int の2種類だけでいいよな。
その他は拡張として任意で実装で。
浮動小数も標準から外しておけばよかった。
267デフォルトの名無しさん:2009/11/24(火) 01:23:57
>264
他に何があるのよ
_Boolと_Complexですか
268デフォルトの名無しさん:2009/11/24(火) 01:48:25
ttp://piza.2ch.net/log/prog/kako/943/943232552.html
にあるのと同じと思われる現象が起こってしまいました

malloc関数の実行の時点でプログラムが止まってしまいます
戻り値を調べようにも、戻る前で動作がストップしている模様
どういった例外が考えられるでしょうか

win vistaでbcc 5.5です
269デフォルトの名無しさん:2009/11/24(火) 01:52:13
それ以前にヒープを破壊している。全然不思議な現象じゃない。
270デフォルトの名無しさん:2009/11/24(火) 01:57:06
メモリが3GBとか4GBとかになった今
malloc(100)程度でNULLになるわけないから
if(NULL)省略していい?
271デフォルトの名無しさん:2009/11/24(火) 02:03:18
>>270
だめです
今すぐC言語から離れて下さい
272デフォルトの名無しさん:2009/11/24(火) 02:05:42
if(NULL)hoge();
hoge()は実行されないんで、省略可
273デフォルトの名無しさん:2009/11/24(火) 04:27:14
printf("%f", 10);
// の後に何らかの関数、更にその後で
printf("%f", 10);

とやると、printfは両方とも異なる値を返します。
フォーマット指定子と引数の型が違うからおかしくなるってのは分かるんですが、
何故そういう動きになるのでしょうか?
274デフォルトの名無しさん:2009/11/24(火) 06:48:24
>>273
printf("%f", 10, 0);
でおk
275デフォルトの名無しさん:2009/11/24(火) 07:19:31
>>273
%fに対応する引数を読もうとして、10と一緒にスタック上のゴミも拾っちゃうんだろ。
返り値が変わるってのは、間の処理でたまたまそのゴミが変化してるんだろうな。
276デフォルトの名無しさん:2009/11/24(火) 10:29:16
>>273
その printf を呼び出しているブロックから抜け出るまで
スタックは詰みっぱなしにしておき、最後にまとめて解放
という処理系はあった

そのような処理系では1回目の printf と2回目の printf が
見ているメモリのアドレスが異なることになる
277デフォルトの名無しさん:2009/11/24(火) 11:45:05
>>273
%fで8バイトのデータをスタックから読み込む
しかし関数に渡しているのはint型の4バイトのみ
残りの4バイトの値は不定なので実行するたびに異なる値が出る
278デフォルトの名無しさん:2009/11/24(火) 12:27:26
表示が違う、んじゃなくて
戻り値が違う、ってことだろ?
printf の戻り値は書いた文字数だから、
表示が違えば戻り値も変わるの当たり前だろ。
printf("a") なら戻り値 1 だし、
printf("aa") なら戻り値は 2 だ。
279デフォルトの名無しさん:2009/11/24(火) 12:57:43
そうなのかね?>>273
280デフォルトの名無しさん:2009/11/24(火) 13:53:37
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);
}
281デフォルトの名無しさん:2009/11/24(火) 13:55:06
あ、ちょっとまった
fwscanf(fp,L"%s %d",str,&num);
これに訂正
282デフォルトの名無しさん:2009/11/24(火) 13:56:08
まずファイル開くところから直せ。
283273:2009/11/24(火) 14:11:42
回答ありがとうございました。
確かに表示も違いますが戻り値も異なりました!
284デフォルトの名無しさん:2009/11/24(火) 18:58:22
>>282
&抜けてたw
それは視野に入ってました
問題はワイド文字から整数をどうやって得るかです
285デフォルトの名無しさん:2009/11/24(火) 19:03:30
wcstol
286デフォルトの名無しさん:2009/11/24(火) 19:25:53
>>285
今どき16ビットマイコンとかないよ
287デフォルトの名無しさん:2009/11/24(火) 19:31:55
>>286 は誤爆か?
288デフォルトの名無しさん:2009/11/24(火) 19:32:02
釣り針でかすぎ
289デフォルトの名無しさん:2009/11/24(火) 19:40:09
fwscanf関数でワイド文字から整数を抜き出すのは不可能なのでしょか?
MSDNの関数の説明にはfwascanfでint型も格納できるみたいなことが書いてあります
290デフォルトの名無しさん:2009/11/24(火) 19:45:49
>>256>>257
なるほどやっと理解できましたありがとうございます!
これからもわからないことがありましたら聞かせていただくくことことがあると思いますのでそのときはよろしくおねがいします。
291デフォルトの名無しさん:2009/11/24(火) 19:50:44
>>289
ファイルのエンコードが違うとか、
文字列が空白を含むとか、
そういうオチ?
292デフォルトの名無しさん:2009/11/24(火) 20:04:41
>>280
samep01.txtはUTF-16になっているか?

あと、bやccs=UNICODEは本当に必要か。どれかが要らない。
http://msdn.microsoft.com/ja-jp/library/z5hh6ee9.aspx
fopen_sの説明を見れば分かるように、ファイルにBOMがあればccsは不要。
BOMがない場合でUTF-16LEのテキストなら、ccsはUNICODEではなくUTF-16LEの指定が必要。
あるいは、そこには明記されていないが、バイナリモードでは文字コード変換も行われないためccsの指定は反映されない。
293デフォルトの名無しさん:2009/11/24(火) 20:11:10
>>292
では、早速メモ帳で開いてみますね
294デフォルトの名無しさん:2009/11/24(火) 20:29:54
>>291
余計に酷くなったw
295デフォルトの名無しさん:2009/11/24(火) 20:43:41
ちなみにメモ帳の内容はこれです
「0 指南48.txt 竹やぶ.mp3 アナルファックで君を独占」
296デフォルトの名無しさん:2009/11/24(火) 20:44:39
void func(void);
void main()
{
int a;
a=1;
func( );
}

funcはmainとは別のソースファイルに記述してあるものとします。
この状態で、グローバル変数や引数を使わずに、func内で上で定義したaを使いたいのですが
どういった方法があるでしょうか?
同じスコープ内だから、funcが書いてあるソースファイルの上に、extern int aを追加して
たのですが、コンパイラに定義されていないと言われました。
297デフォルトの名無しさん:2009/11/24(火) 20:50:32
定義と宣言は違う。
298デフォルトの名無しさん:2009/11/24(火) 20:51:48
引き数を使いたくないなら間接的にやりとりするしかない。
299デフォルトの名無しさん:2009/11/24(火) 20:53:33
そのやりとりの方法を教えてくださいって言ってるんです。
文章読めないんですか?
300デフォルトの名無しさん:2009/11/24(火) 20:54:42
グローバル変数使わずにとか言っておきながら
いきなり自分ですぐにルール破っちまうのな。
301デフォルトの名無しさん:2009/11/24(火) 20:56:47
アナルファックとか、いったら顔真っ赤にしちゃって
チン毛の生えてない消防かよ。
302デフォルトの名無しさん:2009/11/24(火) 20:57:28
別ファイルじゃなくて同ファイルだとしても、
引数でもなくグローバル変数でもないmain内の変数aを
func()内で使う方法なんてないと思うんだが。
303デフォルトの名無しさん:2009/11/24(火) 20:58:34
グローバル変数も引数もどっちも無しとなるともうC言語の範疇では無理だな。
スタックポインタの値から辿って探すとかすれば?
304296:2009/11/24(火) 20:59:37
>>299は自分ではありません

やっぱりグローバル変数を使わないと無理ですよね。
305デフォルトの名無しさん:2009/11/24(火) 21:02:02
まず設問が曖昧なんだよな。
引き数禁止、ってのが func() の引き数として渡すのが禁止ってだけなら簡単なんだが。
引き数自体を全面禁止されるともう無理だろ。
306デフォルトの名無しさん:2009/11/24(火) 21:02:26
時代は32bit必須なのに、お舞らの頭の中は16ビットマイコンか
wchar_t型で宣言するんじゃなくて、wint_t型で宣言するんだよ。
このブォケ!!!あなた方の頭の中のClock数が間違ってると思います
307デフォルトの名無しさん:2009/11/24(火) 21:11:40
wchar_tは16bitでも32bitでもないよ^^
規格票ではchar以上のサイズがあればいいことになってる。
wint_tも実装定義だし^^
308デフォルトの名無しさん:2009/11/24(火) 21:41:58
>>295
そのファイルから読み込むのがうまくいったら、numとstrの中身が何になってほしいと考えている?
309デフォルトの名無しさん:2009/11/24(火) 21:50:39
エンコードされたURLをデコードしたいんだけど、
結果→Shift-JIS EUC UTF-8 になるように、
ライブラリは使わずにやる方法はないでしょうか?

また、エンコードされたURLを元は何の文字コードだったのかを判定する方法も教えていただきたいです。
(CodeManager.getcode で実現できるようなのですが、ライブラリのソースが見つかりません。
見れるサイト等ありましたらお願いします。)
310デフォルトの名無しさん:2009/11/24(火) 23:13:50
URLのエンコードってUTF-8でされるんじゃなかった?
311デフォルトの名無しさん:2009/11/24(火) 23:26:44
printfで、Hex2桁を表示する方法を教えてください
printf("%2X", hoge);
では表示できませんでした(8桁になってしまう)
312デフォルトの名無しさん:2009/11/24(火) 23:30:31
>>311
printf("%2X", hoge & 0xFF);
313デフォルトの名無しさん:2009/11/24(火) 23:30:41
printf("%2X", hoge&3);
314デフォルトの名無しさん:2009/11/24(火) 23:32:45
>>311
printfの書式文字列はWindows上の某コンパイラはマニュアルと
実際に食い違いがある(%i)
よってprintf系はWindowsだろうがUNIX系だろうが
慣れるまで思い通り動かないと思ったら別の方法を考えるのが
早いことが多い
たとえば

printf("%s",ToHex(hoge));

char *ToHex(char hoge){
//ここの部分を自分で埋める
}
315デフォルトの名無しさん:2009/11/24(火) 23:39:47
char *ToHex(char hoge){
static char hx[3];
hx[0] = "0123456789abcdef"[hoge>>4&0x0F];
hx[1] = "0123456789abcdef"[hoge&0x0F];
hx[2] = '\0';
return hx;
}
316デフォルトの名無しさん:2009/11/24(火) 23:48:45
>>314
ポインタを返すのはまずいんではないか?その返したポインタを delete なり free する必要がでてくるかも。
static な領域ならば、それはそれで別の問題が。
317デフォルトの名無しさん:2009/11/24(火) 23:52:23
どうゆう問題?
318デフォルトの名無しさん:2009/11/24(火) 23:55:33
再入可能でなくなる
319デフォルトの名無しさん:2009/11/25(水) 00:01:50
うーむ。深い。
再帰やマルチスレッド対応まで最初から考慮するのか。
320デフォルトの名無しさん:2009/11/25(水) 00:06:42
いや、その前に、例えば、>>315の実装だと
printf("%s %s",ToHex(hoge), ToHex(fuga));
みたいな使い方ができない。
321デフォルトの名無しさん:2009/11/25(水) 00:06:49
>>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;
}
323デフォルトの名無しさん:2009/11/25(水) 00:15:49
do{ c = getch(); }while((c != '1') && (c != '2') && (c != '0'));
324デフォルトの名無しさん:2009/11/25(水) 00:17:47
>322
入力部分のscanf()を,fgets()とsscanf()で置き換える。
fgets()した後、入力が数字かどうかを判定し、数字ならsscanf()で解析。
数字以外なら、再度入力を促すなり終了させるなり。
325デフォルトの名無しさん:2009/11/25(水) 00:35:05
scanf の戻り値を確認すればいい。
326デフォルトの名無しさん:2009/11/25(水) 00:39:26
こんな感じ。
#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;
}
327デフォルトの名無しさん:2009/11/25(水) 00:41:43
下にもあった……
328デフォルトの名無しさん:2009/11/25(水) 00:45:03
まあ atoi(gets(buf)) がオススメ。
329322:2009/11/25(水) 00:51:36
みなさん、短時間で数多くの回答ありがとうございます。

とりあえず、>>326さんのプログラムを使いやってみます。

本当にありがとうございました
330デフォルトの名無しさん:2009/11/25(水) 00:56:25
scanf と数字は鬼門だな。
まあ、練習なんだから誤入力は無いものとして作ればいいと思うよ。
どうせ scanf なんてすぐ使わなくなるしな。
細い仕様なんて覚えても意味が無い。
331デフォルトの名無しさん:2009/11/25(水) 01:08:44
>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);

332デフォルトの名無しさん:2009/11/25(水) 01:18:59
gets()は改行を外してくれるから便利だよな。
毛嫌いしてる奴もいるけど。
333デフォルトの名無しさん:2009/11/25(水) 01:31:30
必ずしもそうでもない
改行の有無を知りたい場合もある
334デフォルトの名無しさん:2009/11/25(水) 01:34:33
アルゴリズムの勉強って詰め将棋を考えるのとほとんど変わらないな・・・
335デフォルトの名無しさん:2009/11/25(水) 03:18:30
否定したいんだかなんなんだか
無意味なコメントだね
336デフォルトの名無しさん:2009/11/25(水) 03:20:57
>>309

すみませんこちらお願いできませんか・・・ 四苦八苦しています。

>>310
http://www.tagindex.com/tool/url.html
こちらのサイト等にあるように、エンコードの種類は複数あります。
337デフォルトの名無しさん:2009/11/25(水) 09:42:50
>>336
ぐぐれ

文字コード変換もコード判定も探せば沢山あるだろ
但し文字コード変換もコード判定も完璧というのは無いので
どこまでやるかは自分で決めなくちゃならない
338釣られてみる:2009/11/25(水) 10:19:11
>>332
gets()を安全に使う方法があるなら使わんでもないが。
339デフォルトの名無しさん:2009/11/25(水) 11:37:17
MS VC なら gets_s てのもあるが、まあ fgets で何も困らんよなあ。
340デフォルトの名無しさん:2009/11/25(水) 14:16:01
>>332
scanf() の安全なパターンか、バッファの容量を指定できる fgets() か。
341デフォルトの名無しさん:2009/11/25(水) 16:23:31
>>332
仕様から安全性を予測するのもスキルのひとつ。
342デフォルトの名無しさん:2009/11/25(水) 16:32:31
標準ではないが getline(3) 便利すぎる
343デフォルトの名無しさん:2009/11/25(水) 16:51:14
入門者、初心者、中級者、上級者に分けた場合

入門者と初心者の間はどのくらいのレベルですか?
どんなプログラムを組めるようになれば入門者ではなく初心者になれますか?
344デフォルトの名無しさん:2009/11/25(水) 16:53:44
ソース入力、翻訳、エラー訂正、実行、の流れがわかること
345デフォルトの名無しさん:2009/11/25(水) 17:08:59
>>343
初心者 入門者 初級者 中級者 上級者 入段者 ...
この区別は簡単なようで意外に難し
いが世の中では概ね上の順序に沿
って変化していくことが想定され
ているのではないかと
ただプログラミング言語とか言語に限っては
極度にレベルというものが定義しにくいからな
入門者はある程度本気で学んでやろうと考えた
段階のことなのかも知れない
346デフォルトの名無しさん:2009/11/25(水) 17:09:30
プログラマレベル
ttp://www.geekpage.jp/blog/?id=2007/7/9
347デフォルトの名無しさん:2009/11/25(水) 17:10:14
訂正
×入門者は
○入門者とは
348345:2009/11/25(水) 17:11:19
347=345ね
349デフォルトの名無しさん:2009/11/25(水) 17:13:04
>>346
今レベル2とレベル3の間くらいだ
350デフォルトの名無しさん:2009/11/25(水) 17:36:56
2と3の少し2よりだと思ってる・・・
351デフォルトの名無しさん:2009/11/25(水) 19:48:59


手前等分からんのかっていう豆知識


リエントラントと、スレッドセーフは全然違う。
スレッドセーフであってもリエントラントであるとは限らない。


352デフォルトの名無しさん:2009/11/25(水) 19:52:39
1塁がセーフだとヒットエンドランである。
353デフォルトの名無しさん:2009/11/25(水) 20:01:02
>>351
具体例をあげてみそ
354釣られてみる:2009/11/25(水) 20:03:47
例えばlocaltime()みたいな関数がスレッドIDごとにメモリを確保したら、スレッドセーフでありながらリエントラントではなくなる。
355デフォルトの名無しさん:2009/11/25(水) 20:04:17
ある変数を変更する関数が400あったとして
それらが同時にアクセスするのを防ぐ方法を考えた
セマーフォでも何でもいい

これはスレッドセーフではあるが
リエントラントとは呼べない。
356デフォルトの名無しさん:2009/11/25(水) 20:15:41
(A)
i++;
if(i>10) i=0;

(B)
if(i>=10) i=0;
else i++;

(A)だと一瞬だけiが10を超えてしまうので、
拙い書き方、になるのでしょうか?
357デフォルトの名無しさん:2009/11/25(水) 20:33:07
>>354-355
リエントラント
= フローインディペンデント or マルチエントラブル
なんでつね。はじめて聞いたw
358デフォルトの名無しさん:2009/11/25(水) 21:00:51
ポインタって内部的にはメモリアドレスがどうこうやってるのかもしれないが
それを意識する必要はないな。
何らかの手段により参照してる
という抽象的な理解でよくて
どうやって参照しているのか
はわからなくても使えるな。
359デフォルトの名無しさん:2009/11/25(水) 21:04:51
OSで動くアプリしか作ったことがないやつはメモリアドレスなどどうでもいいと思うかもしれないが
組み込みは、そんな甘い考えは通用しない。
360デフォルトの名無しさん:2009/11/25(水) 21:12:32
普通そんなもんつくんねーよ^^;
361デフォルトの名無しさん:2009/11/25(水) 21:14:07
というか、メモリアドレスとかメモリマップとかの概念を考えない奴には
まともなCプログラムが組めないと思う
362デフォルトの名無しさん:2009/11/25(水) 21:16:32
足枷ハメりゃいいのだ

組み込みで自由になるスタックは、2MB。
メインメモリで8MB。
CPUはMIPSやSHの250MHz。

これで携帯電話のようにGUIを備えてレスポンスよく反応し
音楽鳴らせてファイル管理できて・・・・
ってのをやってみればよい

OS任せってのがどれほどラクかわかる
363デフォルトの名無しさん:2009/11/25(水) 21:19:22
>>362
自分が使う携帯電話のOSは作ってみたいな
機能を削ってもっとキビキビ動いて欲しい
364デフォルトの名無しさん:2009/11/25(水) 21:19:35
スタック 32k
使用可能メインメモリ コード/データ合わせて128k迄
CPU V30 10MHz
1990年代初頭のPCソフトウェア想定環境
365デフォルトの名無しさん:2009/11/25(水) 21:21:08
>>361
というより、わざわざC言語を使うのはメモリ意識するようなソフトばかりだな。
そうじゃなければ他の言語で済ます。
366デフォルトの名無しさん:2009/11/25(水) 21:21:22
あと組み込みでは、余程甘い職場以外
標準関数は使っていないのでそこも代替出来るかどうかがポイント。

標準関数を使うとスタックを食いまくり、遅くなる

367デフォルトの名無しさん:2009/11/25(水) 21:22:12
組み込みの勉強がしたいならGBAプログラミングに手を出すといい
368デフォルトの名無しさん:2009/11/25(水) 21:29:33
組み込み業界に行く行かないに関わらず、組み込みは勉強しておくと役に立つ。
メモリ管理もそうだが、
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;

とか、絶対に書かなくなる。こういうのに耐えられなくなる。
369デフォルトの名無しさん:2009/11/25(水) 21:31:53
GBAってなんですか?ガバ・・・?
370デフォルトの名無しさん:2009/11/25(水) 21:43:07
それ以前にCで出来る低レベル処理にも下限があるんじゃないかと
それを無視してるんじゃないかと思える処理系が多いという
問題意識を持つ人も居る。
(CはPASCAL並みの高級言語だと1980年代は言われていた
そうだ)
371デフォルトの名無しさん:2009/11/25(水) 21:46:29
>>357
リエントラントという用語は、関数の中に居る人?の視点か
外に居る人?の視点の違いで意味が変わってくる曖昧な専門用語
なんで今は特定の分野の文脈以外では使わないほうが良い。
372デフォルトの名無しさん:2009/11/25(水) 21:53:22
まぁしかし、規格票的にはポインタはあくまでポインタであってアドレス値をどうこうしろとは書いてないんだけどね。
373デフォルトの名無しさん:2009/11/25(水) 21:57:22
C言語でノベルゲームって作れるんですかね?
374デフォルトの名無しさん:2009/11/25(水) 21:59:00
ええ、もちろん
375デフォルトの名無しさん:2009/11/25(水) 22:02:31
ノベルゲームって何以下知らないけど
小説みたいな感じで文章と音楽とグラフィック表示するだけのやつなら
Cなんか使うよりもっと楽な方法がいろいろありそうだ。たぶん。
376デフォルトの名無しさん:2009/11/25(水) 22:03:35
377デフォルトの名無しさん:2009/11/25(水) 22:05:14
C言語だけでは難しいですね。
Windows上でWindowsAPIを利用して作るなら
比較的楽にできますけど。
378373:2009/11/25(水) 22:08:56
みなさんありがとうございます
分岐みたいなのはなくていいんですけど、
ひぐらしみたいなのがつくりたいんです。
379デフォルトの名無しさん:2009/11/25(水) 22:09:49
>>372
それは抽象化のためだし、元来規格とはそういうもの。それを鵜呑みにするのは教育的にどうかと。
380デフォルトの名無しさん:2009/11/25(水) 22:10:22
ノベルゲームを作って遊ぶ目的でC言語の勉強を同時にしてしまおう
という考えは捨てた方がいいかもしれない
381デフォルトの名無しさん:2009/11/25(水) 22:12:38
>>379
つまり、実装によってはアドレスではない可能性もあるってことよ♥
382デフォルトの名無しさん:2009/11/25(水) 22:13:16
お願いします。
全くの初心者ですが、初心者向けの分かり易い本があれば教えて頂けませんか??
383373:2009/11/25(水) 22:14:25
>>380
そうなんですか。
初心者なんですいません。
C言語とは何をするものなんですかね?


抽象的でごめんなさい。
384デフォルトの名無しさん:2009/11/25(水) 22:16:42
いやいや、個人的には超お勧めの考えだと思うよ。
何かを作るっていうモチベーションがあるとないとでは
学習効率がぜんぜん違うから。

珍妙な言語を学ぶくらいなら、
最初からK&R第二版とプログラミングWindows上下を購入して
ごりごりWindowsプログラミングの勉強をした方がいいと思うくらい。
実際、この3冊を読めば、ベクトルグラフィックも、ビットマップグラフィックも、
印刷もタイマもMIDIもマルチスレッドもインターネットも全部使えるようになる。
385デフォルトの名無しさん:2009/11/25(水) 22:17:05
>>383
C言語を勉強するとノベルゲームも作れるかも知れないが逆は真ならず
という奴じゃないの?
386デフォルトの名無しさん:2009/11/25(水) 22:20:56
>>384
うんそだね。珍妙な言語で動作する珍妙なアプリケーションを作る
ぐらいWindows-APIやCの様々な技法を駆使できる機会は無いからね
387373:2009/11/25(水) 22:29:56
>>386
ごめんなさい。
もっと勉強してきますノシ
388デフォルトの名無しさん:2009/11/25(水) 22:39:54
>>383
GNUとかのサイト行けばわかるが、多くのプログラミング言語
処理系のソースはほぼC(C++やObjective-CやJavaもあることは
あるが)
言語が絡む分野では圧倒的な強さというか実績があるんじゃないかと
389デフォルトの名無しさん:2009/11/25(水) 23:01:20
しかしポインタってのは、元々アドレス経由でメモリをいじるためのものだ。

なぜなら、Cとはアセンブラの代替を意図して作られた言語だったから、
アセンブラができることはCでもできねばならなかった。

アドレスに入った値を指し示すというのは副次的な産物であって
それが主目的なわけじゃない。
アドレス経由でメモリをいじる機能を値や関数に適用してみたら
覚えておけるようになったってだけだ。

まあ値も関数もメモリに乗ってる時点でメモリいじりと等価なことだが。
390デフォルトの名無しさん:2009/11/25(水) 23:05:52
ディスプライドライバとか、BIOSでさえCで書かれている。
メモリいじりができるからだ。

もちろん本当に高速な処理が必要なところはアセンブラで書かれているが、
C 9 : ASM 1 といったところ。

Cとは結局、人間にとって分かりやすい言語体系になったアセンブラなのだ。
391デフォルトの名無しさん:2009/11/25(水) 23:06:03
>>381
想像するのは勝手だが、そのような実装は存在するのでしょうか?
392デフォルトの名無しさん:2009/11/25(水) 23:15:21
>>391
プロセス毎にメモリアドレスが独立している

異なるプロセスのメモリを書き換えることが出来ない

アドレスでは無い

とも言えるんじゃね?

物理アドレスと論理アドレスが云々
393デフォルトの名無しさん:2009/11/25(水) 23:17:47
>>391
しらね^^
ただ、メモリにアドレスが振られていないハードや
アドレスが一意でないハードは存在している。
DOS時代にFarポインタとNearポインタなるものがあったそうだけど
その時代には生まれてないので知りまへん^^

あと、仕様的にはポインタが保持しているのはアドレス値ではなく、ポインタ値。
int の 1 と double の 1 が同じビット列とは限らないのと一緒で
int *の 1 と double * の 1 が同じビット列とも限らない(規格票には書いてない…はず^^)。

ポインタがメモリにメモリにアクセスする道具であるのは事実で
しかし、アドレスから一定の抽象性を持って分離していなければならないって感じ?
394デフォルトの名無しさん:2009/11/25(水) 23:22:55
論理アドレスは単にOSが提供する機能

物理アドレスは、メモリコントローラにアクセスしてやればCでも読み書きできる。
BIOSはもちろんそれをやっている

ただページ参照やタグからどうこうだの縦横のアドレスだの
ここいらあたりはCよりアセンブラでやったほうが遥かに短いコードになる
395デフォルトの名無しさん:2009/11/25(水) 23:32:11
なので、論理的には32bitOSであっても16GBや32GBのメモリを扱えることになる。

32bitOSが4GBまでというのは、あくまでOSが提供する論理アドレス<->物理アドレスの変換マップのワクが
4GBまでというだけであって、自分でメモリコントローラにアクセスしてページングしてアドレッシングして、
とやってやれば、メモリコントローラが扱える上限いっぱいまで使用できることになる。
アプリケーションはOSの論理アドレスに依存しているから使えなくても
RAMディスクなどとして使うことだってできるはずだ。

理論上はそうだ。
396デフォルトの名無しさん:2009/11/25(水) 23:33:10
それはないわ。void * との相互変換は保証されてるんだし。
397デフォルトの名無しさん:2009/11/25(水) 23:44:20
あり? void* が 他のポインタ型と相互変換可能なことは
両者のビット列が同一であることを保障する旨の記述あったっけ?^^;;;スマ
398デフォルトの名無しさん:2009/11/25(水) 23:47:11
void* のビット列って何?
399デフォルトの名無しさん:2009/11/26(木) 00:08:34
near、farのことかな。
懐かしいw
400デフォルトの名無しさん:2009/11/26(木) 00:14:49
>>386
Windows上のVC開発のこと?珍妙って某BASICコンパイラのこと?
Windows開発では通用しているスクリプト言語をそれなりに知らないと
辛いだろ。Cだけじゃ駄目なことは間違い無し。
401デフォルトの名無しさん:2009/11/26(木) 00:26:56
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を表示させるにはどうすればよいですか?
402デフォルトの名無しさん:2009/11/26(木) 00:30:38
sizeof(char *) <= sizeof(int *) <= sizeof(double *) <= sizeof(void *)
bit pattern
403デフォルトの名無しさん:2009/11/26(木) 00:34:01
printf("123456789\n");
404デフォルトの名無しさん:2009/11/26(木) 00:34:53
printf("1〜9\n");
405デフォルトの名無しさん:2009/11/26(木) 00:39:50
>>322

これの対策だけど、switchで振り分けてるならdefaultでいったん振り分けて、
影響されない適当な数を代入する じゃいけないかな?
406デフォルトの名無しさん:2009/11/26(木) 00:40:50
すこし前進できたと思います。
あとは頑張ってみます。ありがとうございました。
407デフォルトの名無しさん:2009/11/26(木) 00:50:35
>>405 無理だろ
簡単にしたいならintでなくcharにして最初に0を入れておけばいい
408デフォルトの名無しさん:2009/11/26(木) 01:02:02
>>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');
}





409401: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;

これで数字の表示はいけそうなので次の作業をやってみます。
いきずまれば、また見直してみます。
みなさんアリガトウございました。
410デフォルトの名無しさん:2009/11/26(木) 01:23:52
ゲームPGは面白いんだろな。ただ脳の爆発には注意
411401:2009/11/26(木) 01:28:22
勉強を初めてまだ2週間なので簡単なナインくらいしか作れませんが、
もっとできればいろいろルールを増やせて楽しそうだなと思ってます。
412デフォルトの名無しさん:2009/11/26(木) 01:41:32
>>402
わざわざ違ってる理由が無いと思うが。
413デフォルトの名無しさん:2009/11/26(木) 01:46:26
int a[2];
printf("%d", sizeof a);

これは 8 なのか 2 なのか、あるいは 4 なのか、
どれが正しいの?
414デフォルトの名無しさん:2009/11/26(木) 01:50:14
実行するなり規格票見るなりすればいいじゃん
415デフォルトの名無しさん:2009/11/26(木) 01:51:08
理由どうこうじゃなく、単に規格票で同じことが保証されてないってだけでしょ。
416デフォルトの名無しさん:2009/11/26(木) 01:52:32
>>415>>412あてね。
417デフォルトの名無しさん:2009/11/26(木) 01:52:57
処理系に依存するからこそsizeofがある。
まさに「逆に考えるんだ!」だな。
418デフォルトの名無しさん:2009/11/26(木) 02:02:30
別に整数のサイズが処理系依存しなくてもsizeofは必要
419デフォルトの名無しさん:2009/11/26(木) 02:11:03
sizeof a/sizeof intが2になることは規格票で要求されていますか?
420デフォルトの名無しさん:2009/11/26(木) 02:12:48
かっこ付けろボケ
421デフォルトの名無しさん:2009/11/26(木) 02:15:36
さあ。
配列というものはそういうものでないと困るがな。
422デフォルトの名無しさん:2009/11/26(木) 02:38:02
てことは

wchar s[8];
fgetws(s, sizeof s, stdin);

は間違いというわけだな?
TCHAR 使って fgets と切り替えにしてるとマズいわけだ。
423デフォルトの名無しさん:2009/11/26(木) 03:09:27
>>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;
}
424デフォルトの名無しさん:2009/11/26(木) 10:35:56
>>345










…初恋が何だって?
425デフォルトの名無しさん:2009/11/26(木) 10:44:13
>>422
そこで
#define numberof(v) (sizeof(v) / sizeof *(v))
ですよ
426デフォルトの名無しさん:2009/11/26(木) 10:45:36
XNAってマジキチいな。
C#なら入門サイトも結構あるがXNAのサイトって日本にはほとんどない。
MSDNみてもいきなり専門用語の羅列で何やりゃいいか意味不明。
これでゲーム作ってるひとっているの?
427デフォルトの名無しさん:2009/11/26(木) 10:52:12
まちがえた
XNAってCとは関係ないのか
428デフォルトの名無しさん:2009/11/26(木) 18:59:16


アホがよく勘違いする豆知識
「scanfはバッハオーバーフローする!」


しない。
なぜするのか。

scanf("%d", &FuxckingToshing);

こうでなく、

scanf("%10d", &FxckingToshing);


とすればオーバーフローなどせん。
これを知らないやつが多すぎる。
429デフォルトの名無しさん:2009/11/26(木) 19:12:41
オーバーフローはしないが、オーバーランはするわけで。
430デフォルトの名無しさん:2009/11/26(木) 19:27:21
>>428
%d ってw
%100s とか %255[^\n] とかじゃねーの?
431デフォルトの名無しさん:2009/11/26(木) 19:28:57
%10dなら10桁以上取らない
%3dなら3桁以上取らない
432デフォルトの名無しさん:2009/11/26(木) 19:30:48
誰も聞いてないのに、わざわざ恥晒しにでてくる>>428は公開調教中のMだと思う。
433デフォルトの名無しさん:2009/11/26(木) 19:37:28
むしろ >>428 が何をオーバーフローと言ってるのか気になる
434デフォルトの名無しさん:2009/11/26(木) 19:52:21
大学の講義の課題なのですが、コンパイルしようとすると以下のエラーが出ます

14・15行目:文字列または文字定数が閉じていない(関数 main )
15行目:関数呼び出しに ) がない(関数 main )
18行目:左辺値が必要(関数 main )

何がまずいのかよく解らず…アドバイス下さい
課題の説明が複雑なので、一応渡されたプリントもスキャンしてソースと一緒にうpしました

ttp://www.dotup.org/uploda/www.dotup.org398556.zip.html
435デフォルトの名無しさん:2009/11/26(木) 20:01:58
>>434
さすが大学だと難しいことやるんだな
課題の方は全然わからんw

プログラムソースに問題がなさそうに見える。
とりあえずソースファイルの文字コードを EUCあたりにしてみては?
436デフォルトの名無しさん:2009/11/26(木) 20:12:35
18行目は代入してるんだが、いいのか?
その前のは文字コードだろうな。
437436:2009/11/26(木) 20:18:54
…ていうか report4.c って UTF-8 かよw
438デフォルトの名無しさん:2009/11/26(木) 20:27:28
で、エラーがいかにも某ランド

某ランドのコンパイラ5.5は
ansi以外のファイルではマトモにコンパイルできない。

C99にも準拠しておらず、俺の大好きなlong long intが使えない
439sage:2009/11/26(木) 21:05:25
数百回分の計算データがありそのデータを10回毎に見ていって(10回目、20回目、30回目…)前にみた時より、
aが50増えたらaをbに変更するもの作りたいのですが、どなたかアドバイスください。
440デフォルトの名無しさん:2009/11/26(木) 21:07:05
独自の64bit整数があるはずだが、使おうとするときに思い出せないw
441434:2009/11/26(木) 21:09:06
>>435-438
文字コードが問題ですか
お察しの通りボーランドなんですがw
EUC-JPにも変えてみましたが、エラーが変わらないというのはBCCdevloperのせいですかね…
違うコンパイラ探してみます

>>436
a1=0,b1=1という指定があったので、条件を満たさない場合にはループさせようと思ったのですが記述間違ってますか?
442デフォルトの名無しさん:2009/11/26(木) 21:09:51
>>441
ボーランドならSJISでおk
443デフォルトの名無しさん:2009/11/26(木) 21:14:52
>>441
ak==0 && bk == 1 じゃないとおかしいが、
そもそも値が決まってるなら入力させる必要はないだろw
444素人学生その5:2009/11/26(木) 21:20:48
はい!!!
先生!!!!質問があります!!!!
今作っているプログラム内で使用しているAPI(とあるソフト)を最新版に更新したらなぜかシステム終了時にアクセス違反が発生するようになってしまいました.
どうもatexitを抜けた後,crt0dat.c内のif(__onexitbegin){}を3回ほどループして,この関数を抜け出すところ(?)でアクセス違反が起きているようです.
どうやったら解決できるか教えてください!!

ちなみにAPIを更新する前は問題ありませんでした.
445デフォルトの名無しさん:2009/11/26(木) 21:21:41
1からnまでのすべての奇数の和を求めたいです。
446デフォルトの名無しさん:2009/11/26(木) 21:22:06
1からnまでの全ての奇数を足してください
447デフォルトの名無しさん:2009/11/26(木) 21:26:01
>>444
APIの正しい使い方をしてください
今までは運良くエラーとして出なかっただけです
448デフォルトの名無しさん:2009/11/26(木) 21:26:25
ありがとうございます。
449デフォルトの名無しさん:2009/11/26(木) 21:35:13
>>445
((n+1)/2)*((n+1)/2)
450素人学生その5:2009/11/26(木) 21:37:07
>>447
仮にAPIの使用方法が間違っていると,exit時にアクセス違反が起こる可能性があるとうことでしょうか?

451434:2009/11/26(木) 21:45:15
>>442
ようやくいけました!
ありがとうございます

>>443
==でしたか 助かりました
ヒントの流れ図に入力を促す文等があったので、入れた方がいいのかな…とw
452デフォルトの名無しさん:2009/11/26(木) 21:49:57

アホがよく勘違いしている豆知識
API


アホはAPIというと、「どっかのライブラリ」
としか思っていないが

ドライバとユーザー入力のインターフェイスならば何でもAPIなのである。
どこぞの会社が作ったライブラリ云々は一切関係ない。

453デフォルトの名無しさん:2009/11/26(木) 21:57:55
いもしないアホを勝手に妄想して叩くとはw
454デフォルトの名無しさん:2009/11/26(木) 21:58:15
>>428さん、乙
455デフォルトの名無しさん:2009/11/26(木) 22:20:39
誰も聞いてないのに、わざわざ恥晒しにでてくる>>452は公開調教中のMだと思う。
456デフォルトの名無しさん:2009/11/26(木) 22:26:22
>>452先生の次回作に期待
457デフォルトの名無しさん:2009/11/26(木) 22:28:49
freeした後にNULL入れ忘れてたとか
458デフォルトの名無しさん:2009/11/26(木) 22:39:37
すいません。セグるってそもそも何なんですか。不正なアドレスと不正じゃないアドレスって何を基準に判断してるんですか
459デフォルトの名無しさん:2009/11/26(木) 22:44:12
タイマーユニットがないCPUで、タイマーを使うにはどうすればいいの。
パルスつっても使い方が分からない。
forループだとCPUによって時間がズレるうえに、ループしてる間はCPUのリソースを食っていることに他ならないわけで
460デフォルトの名無しさん:2009/11/26(木) 22:46:53
ステート数を足し算して時間を調整するとか
461デフォルトの名無しさん:2009/11/26(木) 22:51:52

アホが組んだせいでいろいろ大変になった豆知識
昔のゲームが動かない


15年くらい前の98全盛期、4MHz機だと正常に動くけどそれ以上だと動かない
などというゲームがあった。なぜだろうか。
答えは簡単、初期化やメモリへのロードをforループで待つという、素人も真っ青の方法で待っていたからである。

4MHz未満機で「だいたいこんくらい待てばいいや」と、ソフトウェア的にタイマを作って回していたので
それよりも速い処理族度を持つ機ではループ完了までの早さが変わってしまい、
初期化が行われなかったりメモリにまだ乗ってないのに次の処理に行こうとしたりして動かなかったのである。


462デフォルトの名無しさん:2009/11/26(木) 22:54:01
>>461
Windows95 ってCPUが高速だとインストールに失敗するらしいぜ
463デフォルトの名無しさん:2009/11/26(木) 22:54:05
3 へぇ
464デフォルトの名無しさん:2009/11/26(木) 22:57:24
465デフォルトの名無しさん:2009/11/26(木) 23:15:16
15年前に4MHzのマシンなんてもうないと思うが。
466デフォルトの名無しさん:2009/11/26(木) 23:34:08
世間の標準は33MHzとかくらいだな。
467デフォルトの名無しさん:2009/11/27(金) 00:03:02
>>458
何も無いメモリ空間に神がメモリを割り当てる。全部は割り当てられないから、一部だけだ。
割り当てられた部分が不正じゃないアドレス。まだ割り当てられていない部分が不正アドレス。

>>459
その昔、vsync割り込みと言う手法があってな… ようするに使えるものは何でも使う。
468デフォルトの名無しさん:2009/11/27(金) 00:26:29
>>461
4Mhz って何?
98 って 5Mhz 系とそれ以外だったろ
469デフォルトの名無しさん:2009/11/27(金) 00:31:12
Z80
470デフォルトの名無しさん:2009/11/27(金) 00:33:02
88は4MHzでSR以降は8MHzと切り替えあったからそれのことなんじゃね?
20年以上前の話だがな。
471401:2009/11/27(金) 01:14:55
>>423
アカギが死ぬ間際、最後にしたギャンブルです。
トランプでも雀パイでもできるギャンブルで、
相手も自分も1〜9のカードを用意して好きな数を選んで出す。
自分が5を出して、相手が3とかなら、数字の大きい自分の勝ち。
自分が5を出して、相手が6とかなら、数字の大きい相手の勝ち。
自分と相手が同じ数なら引き分け。

9枚消費しきった後の結果で、勝利数の多いほうの勝ち。
相手の使ったカードを覚えておくなどの戦略がある。
472デフォルトの名無しさん:2009/11/27(金) 05:10:19
6502 こそ真の CPU.
473デフォルトの名無しさん:2009/11/27(金) 11:58:49
プログラミングは初めてで
とりあえずC言語を勉強したいのですが
そこで必要となるコンパイラ?でおすすめはありますか?
474デフォルトの名無しさん:2009/11/27(金) 12:17:55
文字列がワイルドカードと一致してるかしらべる方法はありますか
475デフォルトの名無しさん:2009/11/27(金) 12:20:21
自己解決しました
476デフォルトの名無しさん:2009/11/27(金) 12:20:33
正規表現
477デフォルトの名無しさん:2009/11/27(金) 13:23:06
ワイルドカードと一致って
どんな状態だよ?
478デフォルトの名無しさん:2009/11/27(金) 13:26:10
>>473
Turbo C 2.01 オススメ。
統合開発環境付きが欲しかったら
Turbo C++ 1.01 でもいい。
479デフォルトの名無しさん:2009/11/27(金) 13:54:37
>>477
…えっ?
480デフォルトの名無しさん:2009/11/27(金) 14:26:12
Borlandのコンパイラは使えない娘ですかそうですか
481デフォルトの名無しさん:2009/11/27(金) 14:28:56
char s[64];
memset(s,49,sizeof(s));

これは初期か時末尾についたnullを塗りつぶす?つぶさない?
482デフォルトの名無しさん:2009/11/27(金) 14:29:54
日本語でおk
483デフォルトの名無しさん:2009/11/27(金) 16:14:06
今C言語の課題をやっているんですがよくわからないので教えてください。

問題文
任意の画素数をもつ画像をアフィン変換するプログラムを作成しなさい。
変換処理後の画像はファイルとして保存するようにしなさい。

484デフォルトの名無しさん:2009/11/27(金) 16:18:43
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
となりました。このほうが何かメリットがあるのでしょうか。
どうしてこういう仕様になっているのか知りたいです。どなたか教えてください。
485デフォルトの名無しさん:2009/11/27(金) 16:37:47
2の補数でググれ
486デフォルトの名無しさん:2009/11/27(金) 16:39:20
ボーランド人気ありすぎ
487デフォルトの名無しさん:2009/11/27(金) 16:40:18
>>484
足し算などで符号を気にせず同じ様に処理できたりとか
0 + 1 = 1 ・・・ 00000000 + 1 = 00000001
-128 + 1 = -127 ・・・ 10000000 + 1 = 10000001
488デフォルトの名無しさん:2009/11/27(金) 17:05:15
C言語の話じゃないな
2進法がわかってないだろ
489デフォルトの名無しさん:2009/11/27(金) 17:18:06
ソーラン節である。
2進来たかとカモメに問うたのである。

ワケがわからない。
490デフォルトの名無しさん:2009/11/27(金) 17:34:06
is系の関数を使う時に引数をunsigned charにキャストするのは何故なんでしょうか?
調べて見ると、引数として渡せるのは0-255とEOFということなんですが
unsignedだとEOFが渡せないと思います。
491デフォルトの名無しさん:2009/11/27(金) 17:38:42
>>479
言葉の通りの状態を説明してみろよw
492デフォルトの名無しさん:2009/11/27(金) 17:39:17
>>490
EOFを渡す必要がないからでは?
EOFを渡す必要があるなら、渡せるように書くと思うが
493デフォルトの名無しさん:2009/11/27(金) 17:40:17
>>490
キャストなんてせずにintのままで扱います
494デフォルトの名無しさん:2009/11/27(金) 17:42:47
>>493
それをやると非ASCII文字を渡したときに未定義動作。
495デフォルトの名無しさん:2009/11/27(金) 17:44:15
>>491
教えてください、だろう馬鹿者。
496デフォルトの名無しさん:2009/11/27(金) 17:44:25
言葉が足りなかった。
signed charに入った非ASCII文字や256以上の値を渡したときに未定義動作。

497デフォルトの名無しさん:2009/11/27(金) 17:46:58
文字を int として扱うのは getc 類を使う時だけで充分だよ。
498デフォルトの名無しさん:2009/11/27(金) 18:21:58
>>490
太古の昔isxxxxはテーブル参照するマクロだった。その時代の名残。
キミのように疑問を持って理由を考える奴は使わなくなる。
コピペを繰り返すしか能の無い>>493のようなヘボはいまだにキャストしている。
499デフォルトの名無しさん:2009/11/27(金) 18:30:14
今はテーブル参照じゃないの?
500484:2009/11/27(金) 18:34:54
>>485-489
減算を加算で出来るというのが大きな理由のようですね
皆さんレスありがとうございました
501デフォルトの名無しさん:2009/11/27(金) 18:39:10
一体どこからそんな結論を導き出したんだ?w
502デフォルトの名無しさん:2009/11/27(金) 18:48:22
回路設計の面から見たときに、加算器を使って実現できるからっていう
理由があるんで間違ってはいない。
503デフォルトの名無しさん:2009/11/27(金) 19:32:52
#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は出力去れないようにするといった感じです。
504デフォルトの名無しさん:2009/11/27(金) 19:37:02
素数でない辺は飛ばせばいいんだよ
505デフォルトの名無しさん:2009/11/27(金) 19:41:01
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)
このように出したいんだね?
そりゃ多分無理だ
506デフォルトの名無しさん:2009/11/27(金) 19:45:06
80歳の耄碌爺婆になってから考えれば良いこと
507490:2009/11/27(金) 19:45:10
みなさんありがとうございます。
EOFを渡す必要がないということで納得しました
508デフォルトの名無しさん:2009/11/27(金) 19:46:28
>>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)
にする
509デフォルトの名無しさん:2009/11/27(金) 19:46:39
>>503
>排除したいのですができません。
チェックしてないからじゃね?

>例えば3:4:5が先に出力されていたら
それまで出力した組み合わせをすべて覚えておかないと
判断できんわな。
510デフォルトの名無しさん:2009/11/27(金) 19:56:13
>>503
宿題スレで答えてもらってんのに理解できなかったのかw
511デフォルトの名無しさん:2009/11/27(金) 20:06:52
ううーむ

俺は今まで
ポリデントとかどうでもいいじゃん、と思っていたが
トゥーーチャノォ(英語は発音大事)などで半角スペースやタブが削除され
ポリデントされてないソースを見たら
やっぱタブは大事だなと思った
512デフォルトの名無しさん:2009/11/27(金) 20:09:22
Google Coding Standards ではスペース2個にしろ、タブを使うなと書かれている。
513デフォルトの名無しさん:2009/11/27(金) 20:09:53
>>511
おじいちゃん お口くさい
514デフォルトの名無しさん:2009/11/27(金) 20:34:46
>>483
画像形式は?
515デフォルトの名無しさん:2009/11/27(金) 20:36:20
>>513
そういう マナちゃんの あそこもちょっと...
516デフォルトの名無しさん:2009/11/27(金) 20:50:04
>>509
んな馬鹿な。最大公約数が 1 でないものは省けばいいのでは?
517デフォルトの名無しさん:2009/11/27(金) 21:07:25
それが508なんだが、503には多分理解できない
518デフォルトの名無しさん:2009/11/27(金) 21:27:29
あれだよ、gcmが大文字でGCMと書かれてないからだよ。
大文字で書かれてれば「最大公約数」ってすぐわかる。
この略号、中学校で全員習うからね。
519デフォルトの名無しさん:2009/11/27(金) 21:28:10
>>518
M は何の略でしょうか?
520デフォルトの名無しさん:2009/11/27(金) 21:28:47
ググレカス
521デフォルトの名無しさん:2009/11/27(金) 21:28:52
GCD or LCM
522デフォルトの名無しさん:2009/11/27(金) 21:30:02
Turbo C++ 1.01入れてみたのですが、日本語入力不可?
523デフォルトの名無しさん:2009/11/27(金) 21:33:27
Greatest Common Divisor 略してGCD
Greatest Common Measure 略してGCM

どっちも最大公約数をあらわす。

最小公倍数LCMのMと混同してるわけではないので、
下手に突っ込むと逆に恥をかきます。
524デフォルトの名無しさん:2009/11/27(金) 21:40:05
Turbo C++ ってこれか
http://edn.embarcadero.com/article/21751
まだフロッピーの時代なんだ
525デフォルトの名無しさん:2009/11/27(金) 22:29:21
入力以前に日本語モードじゃ動かないだろ。
CP437専用だったはず。
526デフォルトの名無しさん:2009/11/27(金) 22:42:36
素直にmingw薦めればよいものを…
527423:2009/11/27(金) 22:50:37
>>471
演出によって面白いゲームになりそうですね。
キャラクター選択や、それぞれと戦うに至った状況設定などを入れたりすると、
友人間の話の種になりそうです。
練習になりそうだから私も単純な骨組だけ作ってみます。
自己流なので洗練とは遠いですが。
528デフォルトの名無しさん:2009/11/27(金) 23:23:50
定数にenum使ってるんだけど
ビットマスクとかには使わないほうがいいのかな
サイズと符号があいまいだよねこのこ
529デフォルトの名無しさん:2009/11/27(金) 23:38:20
つーか、初心者で C 言語の勉強を始めるなら
とりあえず日本語関連は後回しにしたほうがいいよ。
日本語使うにしてもローマ字で書けばいいしな。
文字列いじったりするのに、かな漢字が入ってると
文字コードがどうとかで面倒だろ。

とりあえず ASCII 文字だけで一通り覚えてからだな。
530デフォルトの名無しさん:2009/11/28(土) 00:31:41
皆がそう考えて罠にハマるw
531デフォルトの名無しさん:2009/11/28(土) 00:35:39
罠ってなんだよ?
ASCII で一通り覚えてから、
それから日本語をワイド文字で使うことを覚えれば良い。
532デフォルトの名無しさん:2009/11/28(土) 00:37:14
訂正。
「日本語を」じゃないな。
かなや漢字を、だな。
ローマ字でも日本語は日本語だもんな。
533デフォルトの名無しさん:2009/11/28(土) 00:58:47
Turbo C++入れてコマンドプロンプトにusって打ち込んで英語モードにしたら英語が標準になっちまった…
jpとかchcp使っても戻らなくて、こんな時間orz
534デフォルトの名無しさん:2009/11/28(土) 01:20:23
jp ってのはバッチファイルで、
中身は単なる
chcp 932
だろ。
535デフォルトの名無しさん:2009/11/28(土) 01:27:15
CP932 ってことは、
コマンドプロンプトって Shift-JIS なの?

NT 系の Windows って Unicode なんじゃなかったか?
UTF-16(LE) じゃないの?
536デフォルトの名無しさん:2009/11/28(土) 01:39:26
Windows内部ではUNICODEで処理されているけど
インターフェース(コマンドプロンプト等)は基本Shift-JIS
・・・だったはず
537423:2009/11/28(土) 02:20:06
>>471
ナインのゲームのソースをざっと作ってみました。
どうでしょうか?
詳しい方、マシなソースになるようにアドバイスを
お願いします。
自己流の部分が多いので、一般的な書き方なども教えてください。
自分としては、もう少し関数を切りだして、main関数を
見通しよくできれば、と思います。

ttp://www.dotup.org/uploda/www.dotup.org403333.c.html
538423:2009/11/28(土) 03:31:36
539デフォルトの名無しさん:2009/11/28(土) 03:52: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};
540デフォルトの名無しさん:2009/11/28(土) 04:30:32
そのmemcpyの使い方って未定義じゃねーの?
541デフォルトの名無しさん:2009/11/28(土) 05:10:20
未定義だな
memmoveつかうべき
542423:2009/11/28(土) 06:52:16
>>539-541
ありがとうございます。書き直してみます。
543デフォルトの名無しさん:2009/11/28(土) 10:14:07
n=++func();
こういうのってできる?
544デフォルトの名無しさん:2009/11/28(土) 10:21:09
>>543
試せばいいじゃないか
545デフォルトの名無しさん:2009/11/28(土) 11:08:50
試しても、その処理系における動作しか確認できない。
546デフォルトの名無しさん:2009/11/28(土) 11:33:02
逆に言えば、規格を知ってもその処理系の動作は確認できない
547デフォルトの名無しさん:2009/11/28(土) 12:23:05
処理系依存のソースは現金
548デフォルトの名無しさん:2009/11/28(土) 12:29:26
a,b,c,d,・・・,aa,ab,ac,ad,・・・,aaaa,aaab,aaac,・・・
のように順番に文字列を関数に渡していきたいのだけれど再帰でやるのとforでどんどん渡していくのとどちらがよさそうですか?
549デフォルトの名無しさん:2009/11/28(土) 12:41:47
「のように」がよく分からないが、a〜zを使った26進数の数値の連番てこと?
多分forの方が簡単
550デフォルトの名無しさん:2009/11/28(土) 12:42:15
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

よろしかったらご教授願います
551デフォルトの名無しさん:2009/11/28(土) 12:50:53
> scanf("%d",n);

まずはこれ。
値渡しでは入力を受け取れない。

scanf("%d",&n);

のようにして n のアドレスを渡せ。
552デフォルトの名無しさん:2009/11/28(土) 13:00:16
>>549
具体的には文字コード00からFFまでの一文字、二文字のすべての組み合わせ、三文字のすべての組み合わせとやって
八文字のすべての組み合わせまでやろうとしてる
553デフォルトの名無しさん:2009/11/28(土) 13:03:32
人は、なぜ条件判断に変数を用意しますか。

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;



なんで無駄に変数を用意しようとしますか。
554デフォルトの名無しさん:2009/11/28(土) 13:15:30
>>552
文字コード00を含めると、文字列の終端と区別つかなくなるのでは?
555デフォルトの名無しさん:2009/11/28(土) 13:19:45
>>552
8文字の全組み合わせって8バイトのデータが 2^64 個だよ?
そんなデータ置く場所があるのかい。
556デフォルトの名無しさん:2009/11/28(土) 13:24:00
>>551
解決しました
初歩的なミスで恥ずかしい限りです
ありがとうございました
557デフォルトの名無しさん:2009/11/28(土) 13:45:30
順列組み合わせは再帰を使った方がソースはスッキリするがforループのがスピードは速い
558458:2009/11/28(土) 14:05:38
http://www.dotup.org/uploda/www.dotup.org404398.c

こんな感じのforループにしてみました
もっとスマートなやり方があればご指摘ください
559デフォルトの名無しさん:2009/11/28(土) 14:11:31
>>558
リテラルを書き換えようとするなよw
560デフォルトの名無しさん:2009/11/28(土) 14:13:13
>>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);
}
561デフォルトの名無しさん:2009/11/28(土) 14:13:40


リテラル派
562458:2009/11/28(土) 14:30:04
>>559
ありゃ、どっかおかしかったですか?
563デフォルトの名無しさん:2009/11/28(土) 15:08:36


優先順位を分かりやすくするため
誰でもわかってる数学のルールどおりであっても
カッコをつける

ABC = (A + (B * C));


(((((((((((((((((((((((((((; ゚д゚))))))))))))))))))))))))))))))))) これはやりすぎである。
564デフォルトの名無しさん:2009/11/28(土) 15:17:37
(ABC = (A + (B * C)));
565デフォルトの名無しさん:2009/11/28(土) 15:55:12
ここで Lisper 登場!
566デフォルトの名無しさん:2009/11/28(土) 17:21:42
563みたいなバカと一緒に仕事するハメになったら、
どんだけカッコつけてもやりすぎってことはないだろw
567デフォルトの名無しさん:2009/11/28(土) 17:36:36
M = (N = ((S = A + B) + (C * D)));
568デフォルトの名無しさん:2009/11/28(土) 18:22:02
下の素数を求めるプログラムについてなんですが高速化を図るために#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;
}
569デフォルトの名無しさん:2009/11/28(土) 18:55:43
ループで毎回sqrtなんか計算してたら遅いわな
570デフォルトの名無しさん:2009/11/28(土) 18:59:31
>>569
そもそも出力結果が違ってしまうんですがどこを改善したらいいんでしょう?
571デフォルトの名無しさん:2009/11/28(土) 19:01:59
2を外に出して
for(j=3; j*j<=i; j+=2) {
if(i%j==0) {
f = 1;
break;
}}
でいいんじゃね?
572デフォルトの名無しさん:2009/11/28(土) 19:04:18
j<=sqrt(i)
573デフォルトの名無しさん:2009/11/28(土) 19:05:31
>>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;
}
574デフォルトの名無しさん:2009/11/28(土) 19:11:12
>結果に変化は無かった
どこかだよw
575デフォルトの名無しさん:2009/11/28(土) 19:19:23
>>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
576デフォルトの名無しさん:2009/11/28(土) 19:21:07
>>575
一々そんなの書かなくても普通はぱっとみて分かる。
573が底抜けに頭悪いだけだから気にすんな。
577デフォルトの名無しさん:2009/11/28(土) 19:27:35
>>576
いえ自分も気をつけるようにします

それと最後に一つ聞きたいんですが>>571のようにbreak;は入れた方がいいんですかね?
578デフォルトの名無しさん:2009/11/28(土) 19:28:41
一回割り切れることが分かったら、後の判定は無意味で無駄な処理だからbreakすべき。
579573:2009/11/28(土) 19:30:32
ごめん、diff で確認したつもりだったけど、同じコマンドの結果を比較してたっぽい
580デフォルトの名無しさん:2009/11/28(土) 19:30:40
>>578
なるほど
ありがとうございました
581デフォルトの名無しさん:2009/11/28(土) 22:13:18
>>539-541
書き直しました。
ttp://www.dotup.org/uploda/www.dotup.org405932.c

引数の並べ方の順番がいつも適当なのですが、
並べ方の順番の規則、のようなものがあれば、教えてください。
582581:2009/11/29(日) 00:14:33
タブが見苦しいので整形しました。
ttp://www.dotup.org/uploda/www.dotup.org406494.c
583デフォルトの名無しさん:2009/11/29(日) 00:18:23
かなり初歩的かと思いますが文字列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);
}
584デフォルトの名無しさん:2009/11/29(日) 00:19:59
typedef struct Memory{
  T_BAR Bar;
  int   *Gr;
}T_BAR;

T_BAR STRC_BAR;

STRC_BAR = (T_BAR *)malloc(DoubleStr);


これってどこに何の値が入るのですか。
585デフォルトの名無しさん:2009/11/29(日) 00:20:38
scanf("%d",y);
586デフォルトの名無しさん:2009/11/29(日) 00:21:59
ばぐってる
587デフォルトの名無しさん:2009/11/29(日) 00:23:08
588デフォルトの名無しさん:2009/11/29(日) 00:25:29
Cって文字列で取ったら配列に一括で代入できたか??
一文字しか取れへんような気もするが!
589デフォルトの名無しさん:2009/11/29(日) 00:31:41
そこらはコンパイラがやってくれるのか
590デフォルトの名無しさん:2009/11/29(日) 01:20:35
>>587>>585
ぐはっ初歩的過ぎてすげ-ショックorzすみませんありがとうございました。
ただでさえ&忘れるのに文字列には&つけないとかわからなくなるー
591デフォルトの名無しさん:2009/11/29(日) 08:40:45
>>590
&x[0]とでもしておけばおk
592デフォルトの名無しさん:2009/11/29(日) 14:42:59
小文字を大文字に変換する関数のプログラムなんですがどのように値を返したらよいのでしょうか?
returnで返すのかvoidでよいのかよくわからないです

setupper(str)

void setupper(char *s)
{
while(*s!='\0'){
if(*s>='a' && *s<='z')
*s+='a'-'A';
}
}
593デフォルトの名無しさん:2009/11/29(日) 14:56:00
>>592
toupperつかえよ
594デフォルトの名無しさん:2009/11/29(日) 16:20:39
>>583
> printf("文字列を入力してください:");scanf("%s",x);
> printf("何回表示するか入力してください:");scanf("%d",y);

これって
scanf("%s",x);
だと改行文字がバッファに残るから
scanf("%d",y);
で入力できないんじゃないの?
scanf("%d",&y);にしたとしても
595デフォルトの名無しさん:2009/11/29(日) 16:34:44
試してから書けよ
596デフォルトの名無しさん:2009/11/29(日) 16:35:33
皆さんデバイスドライバって書いたことありますか?
597デフォルトの名無しさん:2009/11/29(日) 16:43:13
ないでもない
598デフォルトの名無しさん:2009/11/29(日) 16:52:18
ある
599デフォルトの名無しさん:2009/11/29(日) 17:01:41
>>593
そういわれたらそうなんですがここは使わない場合を教えていただければ幸いです
600デフォルトの名無しさん:2009/11/29(日) 17:13:27
>>592
returnで返すならvoidじゃだめだろ?
601デフォルトの名無しさん:2009/11/29(日) 17:14:28
>>600
voidでもreturnくらいできるだろ
602デフォルトの名無しさん:2009/11/29(日) 17:16:27
>>601

そのreturnに意味はあるのか?
603デフォルトの名無しさん:2009/11/29(日) 17:16:43
>>592
どうやってその関数を使用するのかをまず決めないとな。
604デフォルトの名無しさん:2009/11/29(日) 17:17:50
char hoge (char abc[])
{


なんたらかんたら


return void;
}
605デフォルトの名無しさん:2009/11/29(日) 17:18:40
>>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++;
}
}
606デフォルトの名無しさん:2009/11/29(日) 17:27:02
関数から値を受け取るときは、return もいいが
ポインタで受けたほうがよい。

returnは1つのreturnにつき1つの値しか返せない。
実際には、例えば return A1, A2, A3, A4,......と出来るなら
そのとおりにいっぱい取りたいこともよくある。
607デフォルトの名無しさん:2009/11/29(日) 17:27:48
>>605
*s-='a'-'A';と増分するのを忘れてましたね
ありがとうございました
608デフォルトの名無しさん:2009/11/29(日) 19:01:58
rubyだと return A1, A2, A3, A4,......ができるんだよな
609デフォルトの名無しさん:2009/11/29(日) 19:05:59
でっていう
610デフォルトの名無しさん:2009/11/29(日) 19:07:30
しょうがないってことで
611デフォルトの名無しさん:2009/11/29(日) 19:15:21
returnは実行結果の成否を呼び出し側に知らせるためのものだろ?
612デフォルトの名無しさん:2009/11/29(日) 19:18:32
ヘッダファイルに分割するメリットがよくわからないので、教えてください
613デフォルトの名無しさん:2009/11/29(日) 19:43:45
分かりやすいから

ヘッダは定義部分
ソースは定義したものの中身

こう区分けすれば分かりやすい

だからソースファイルにあるものは必ず関数のみ
インクルードファイルはヘッダ除いてなし
グローバル変数もなし

これがベスト
614デフォルトの名無しさん:2009/11/29(日) 19:47:54
>>612
2人以上で共同開発するようになるとありがたみがわかる
615デフォルトの名無しさん:2009/11/29(日) 19:49:22
>>612
フルコンパイルに5分以上かかるようになるとありがたみがわかる
616デフォルトの名無しさん:2009/11/29(日) 19:49:50
>>613-614
*.hはjavadocみたいなものって事でいいんですか?
617デフォルトの名無しさん:2009/11/29(日) 19:54:40
一ついえるのは、

#include "FuckOSX.h"
#include "FuckinMacin.h"
#include "FuckJobs.h"

#define FUCKINTOSH 0

int global;

int main(void)
{
 ・・・・・



とかやってるようなのはダメだということ。

この例なら、
グローバル変数まではヘッダに書く
ソースに書くのはmainだけ
618デフォルトの名無しさん:2009/11/29(日) 20:00:22
多人数で開発する際は、インクルードも

#include <universalstudioJaponese.h>

とかやってはいけない。

#ifndef __Japonese_H__
#define __Japonese_H__
#include <universalstudioJaponese.h>
#endfi


これでなければいけない。
619デフォルトの名無しさん:2009/11/29(日) 20:01:27
sprintf
および
snprintf
はC言語標準でしょうか?
620デフォルトの名無しさん:2009/11/29(日) 20:04:52
#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;
}

これでちゃんと動いたんですが、関数ポインタの引数の型って省略していいんですか?
低水準なところはまだよく分からないんですが、呼び出し規約とか関係したりしますか?
もし省略して問題ないなら利用したいんですが……。
621デフォルトの名無しさん:2009/11/29(日) 20:11:08
C言語ならなんとかしてくれる
622デフォルトの名無しさん:2009/11/29(日) 20:13:12
たぶん
623デフォルトの名無しさん:2009/11/29(日) 20:17:18
省略するとintとして扱われる、64bitではポインタ渡すときに問題が生じる。
32bitでも64bit整数渡すと破綻する。
624デフォルトの名無しさん:2009/11/29(日) 20:17:43
念には念を入れたほうがいいんじゃない??
625デフォルトの名無しさん:2009/11/29(日) 20:19:59
>>619
うん
626デフォルトの名無しさん:2009/11/29(日) 20:22:45
>>625
もしかして
C99からだったりしますか?
627625:2009/11/29(日) 20:34:27
C89からANSI標準です。
628デフォルトの名無しさん:2009/11/29(日) 20:46:29
snprintfはC89からだったのか
629デフォルトの名無しさん:2009/11/29(日) 20:53:55
>>623
intと同じサイズのものなら渡すことが出来るということですね。

省略時に引数の個数は問題にならないのですか?
630デフォルトの名無しさん:2009/11/29(日) 20:58:23
省略しないで可変長の引数宣言使えよ
631デフォルトの名無しさん:2009/11/29(日) 20:59:45
>>611
アホか。
632デフォルトの名無しさん:2009/11/29(日) 21:08:46
char mojiretsu[100]={0};
と書くと、最初の要素だけでなく全てがゼロクリアされるということですが、
それは規格のどの辺に書かれていますか?

また、
char mojiretsu[100]={0,0,0};
と書いたらどうなるのでしょう?
633デフォルトの名無しさん:2009/11/29(日) 21:11:15
char mojiretsu[100]={1,2,3};
と書いたらどうなるのでしょう?
634デフォルトの名無しさん:2009/11/29(日) 21:13:16
1,2,3,0,0,0…と初期化される
635デフォルトの名無しさん:2009/11/29(日) 21:14:03
636デフォルトの名無しさん:2009/11/29(日) 21:28:08
>>617
なにこのガラパゴス的適応しちゃった感満点なソース。
637619:2009/11/29(日) 21:28:14
>>627
ありがとうございました。
638632:2009/11/29(日) 21:29:44
もしかして標準Cではゼロクリアされませんか?
639デフォルトの名無しさん:2009/11/29(日) 21:33:09
静的変数なら 0 で固定。
640デフォルトの名無しさん:2009/11/29(日) 21:39:26
>>639
staticではありません。
普通のauto変数です。
641デフォルトの名無しさん:2009/11/29(日) 21:49:55
初期化されなかった配列の要素は静的変数と同様に0になるってことだろ。
635のリンク先見ればわかるだろ。
642デフォルトの名無しさん:2009/11/29(日) 23:12:21
数字記憶ゲームを作ったのですが、
現状、記憶ゲームではなく、
タイピングゲームになっています。
キーバッファをクリアする方法をwebで
調べても分かりませんでした。

あと、MS-DOSのコマンド"cls"を使っていますが、
環境に依存しない画面クリアの方法も分かりませんでした。

その他、気付いた点があれば、アドバイスお願いします。

ttp://www.dotup.org/uploda/www.dotup.org410223.c
643デフォルトの名無しさん:2009/11/29(日) 23:58:28
キーバッファのクリアも画面のクリアも、環境依存の方法しかないよ。
644デフォルトの名無しさん:2009/11/30(月) 00:02:55
クロスプラットホーと 乱離ぶらり使えよ
645デフォルトの名無しさん:2009/11/30(月) 00:37:12
キーバッファのクリアって、
もしかして gets に渡すバッファのこと言ってる?
646デフォルトの名無しさん:2009/11/30(月) 00:41:11
どっちにしても、そのプログラムにバッファのクリアが必要になる要素は無いよ。
gets に渡すために用意したバッファを初期化して 0 で埋めてるのも無意味。
gets は中身関係なく上書きするだけ。
647デフォルトの名無しさん:2009/11/30(月) 00:45:01
ncursesつかえ
648デフォルトの名無しさん:2009/11/30(月) 00:46:38
\f は殆どの場合は無効だよ。
これはプリンタに対する命令だから。
ページ送り命令な。
649642:2009/11/30(月) 00:50:02
>>643
それなら別の方法を考えたほうが良さそうですね。

>>645
ちょっと変数の名前とコメントが紛らわしかったですが、
キーバッファはbufのことではないです。
今のままだと、数字が画面に表示されているときに
先に入力ができてしまいます。
「入力してください」が表示してから、
入力を受け付けるようにしたいのです。
650デフォルトの名無しさん:2009/11/30(月) 00:51:37
snprintfの無い環境で、
sprintfを使って
snprintfと等価な機能をもつ自作関数を実装することは出来ませんか?
651デフォルトの名無しさん:2009/11/30(月) 00:53:37
どうぞ可変長引数を使って自作してください
652デフォルトの名無しさん:2009/11/30(月) 00:56:18
環境依存で良いなら rewind(stdin) が使えるかもしれない。
先行入力は本来は利点なんだけどな。
653デフォルトの名無しさん:2009/11/30(月) 00:59:22
sprintfを使って実装する事は不可能ですが、
sprintfを使わないで実装する事は可能です。
654デフォルトの名無しさん:2009/11/30(月) 01:05:16
できなくはないよ。
655デフォルトの名無しさん:2009/11/30(月) 01:48:57
画面クリア
win:system("cls")
unix:system("clear")
656デフォルトの名無しさん:2009/11/30(月) 01:57:25
それは正しくはないな。
657650:2009/11/30(月) 06:33:47
何やらとても難しそうですね…。
ちょっと考え直して来ます。
658デフォルトの名無しさん:2009/11/30(月) 11:19:44
自作関数を↓のようにforで回した時
for(i = 0; i < 10; i++) {
sum(a, b);
}
関数内の変数の中身は1回ごとに初期化されますか?
なんだかおかしい結果が出たんですが
659デフォルトの名無しさん:2009/11/30(月) 11:31:43
初期化しているものは、一回ごとに初期化される。
但し、staticならば最初の一回だけ。
660デフォルトの名無しさん:2009/11/30(月) 12:27:31
ポインタ変数とはなんですか?
具体的にお願いします。
661デフォルトの名無しさん:2009/11/30(月) 12:29:52
void *p; /* pはポインタ変数 */
662デフォルトの名無しさん:2009/11/30(月) 12:37:11
書式ではなくて意味を教えてもらいたいのですが・・・・
663デフォルトの名無しさん:2009/11/30(月) 12:38:47
別の変数を指し示す変数
664デフォルトの名無しさん:2009/11/30(月) 13:08:00
アドレス幅の符号無し整数型の変数
665デフォルトの名無しさん:2009/11/30(月) 14:21:53
>>659
関数内で文字列である仮引数にH.を連結させているのですが、なぜかforした分だけ仮引数にH.が連結されてしまっています
実引数と仮引数の名前は一緒にしていますがこれは問題ないはずですよね?
666デフォルトの名無しさん:2009/11/30(月) 14:24:28
ない
ソースplz
667デフォルトの名無しさん:2009/11/30(月) 15:08:31
>>642
バッファの件だが、環境依存しない良い方法を思いついたよ。
バッファリングはプロセス毎のものだから、入力だけを別プロセスにすればいい。

#include <stdio.h>
int main(){
char b[128];
return atoi(gets(b));
}

これをコンパイルして inp.exe としておいて、
本体のプログラム内で入力が必要になったところで

inp = system("inp");

とすればいい。
668デフォルトの名無しさん:2009/11/30(月) 15:36:19
>>667
system関数の返り値が環境依存
669665:2009/11/30(月) 16:00:20
ttp://www.nigauri.sakura.ne.jp/src/up14099.bin

ソース
なんだかもういろいろとおかしいような気もしますが
670デフォルトの名無しさん:2009/11/30(月) 16:06:23
普通に宣言された変数ってreturnのとき開放されてるの?
671デフォルトの名無しさん:2009/11/30(月) 16:42:44
開放されてる
672デフォルトの名無しさん:2009/11/30(月) 17:17:02
すみません。対称な行列を扱っているのですが、これは、
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のどこに入っているかを調べたいのです。
これは、多数のプロセッサで、またはスレッドで動作させるので
なるべく計算量が少なく求めたいのですが
いい方法はないでしょうか。
673デフォルトの名無しさん:2009/11/30(月) 17:20:41
計算量も糞も普通に式たてればO(1)で求まるだろ
それをさらに最適化したいというなら別だが
674デフォルトの名無しさん:2009/11/30(月) 17:22:09
一個一個数えていくしか方法を思いつかず、O(N)になってしまいます。
どういう式になるかわからないので、教えていただきたいのですが。
675デフォルトの名無しさん:2009/11/30(月) 17:23:58
>>669
よく見てないけど
strcat(tripkey, "H.");
してりゃ当然なんじゃ?
676デフォルトの名無しさん:2009/11/30(月) 17:35:44
ウィンドウズとユーナイックスは文字表示のツツテムコールも全然違っている

ウィソドウズint 13h
アンアイクスint 80h
677デフォルトの名無しさん:2009/11/30(月) 17:43:37
>>674
有名な割にはあまり役に立たない等差数列の和の公式が役に立つところじゃね?
678デフォルトの名無しさん:2009/11/30(月) 17:48:51
>>677
idx = i*N+j-i*(i+1)/2
ということで、動かしてみます。
679デフォルトの名無しさん:2009/11/30(月) 18:08:41
動きました。
ありがとうございました。
図を描いて考えてみたら、すぐでした……。
680デフォルトの名無しさん:2009/11/30(月) 18:50:14
これさ、逆は難しいかもね。
idx=f(i,j)は簡単だけど
i=g(idx) j=h(idx) ってなる関数が思いつかないや。
681デフォルトの名無しさん:2009/11/30(月) 19:59:31
ねーよw
682デフォルトの名無しさん:2009/11/30(月) 20:04:32
一方向性関数だっけ。暗号作成に使われるんだよね。
683デフォルトの名無しさん:2009/11/30(月) 20:11:33
>>682
いやいや双方向だからw
684デフォルトの名無しさん:2009/11/30(月) 20:12:31
恐怖の暗号アルゴリズムでつね。
685デフォルトの名無しさん:2009/11/30(月) 20:14:22
void f(int idx, int *i, int *j)
{
for(*i=0;;(*i)++) for(*j=0;*j<N-*i; (*j)++) if(idx--==0) return;
}

こんなんで十分じゃね?
686デフォルトの名無しさん:2009/11/30(月) 20:40:13
>>685
いや、実装はできるんだが、idxを求めるみたいに
式一本でできたらきれいだなと思ったんだが。
687デフォルトの名無しさん:2009/11/30(月) 20:42:01
違った
void f(int idx, int *i, int *j) {
for(*i=0; ; (*i)++) for(*j=*i; *j<N; (*j)++) if(idx--==0) return;
}
だな。
688デフォルトの名無しさん:2009/11/30(月) 20:55:39
俺が個人的に許せない書き方

for()
 for()
  for()
   for()
    for()



ナンボ繋げんねん
689デフォルトの名無しさん:2009/11/30(月) 20:56:33
ほいで、大抵のfor地獄って
一工夫加えると1回のforで終わんねん

いいかげんにせえや
690デフォルトの名無しさん:2009/11/30(月) 20:57:43
>>689
実例をば
691デフォルトの名無しさん:2009/11/30(月) 20:59:11
iとjを求めるのに、別々の関数にしちゃうようなアホが、
式を短くすることだけにこだわった効率の悪いコードを書くんだろうなw
692デフォルトの名無しさん:2009/11/30(月) 21:02:32
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
  ・
  ・


こんなの見たことある。  
693デフォルトの名無しさん:2009/11/30(月) 21:03:17
ああ
間違った
!=
694デフォルトの名無しさん:2009/11/30(月) 21:04:58
ダメだ。なんか頭が働いてない!!!
yoisugitaka.
695デフォルトの名無しさん:2009/11/30(月) 21:16:41
「ループの最中にifを入れるな」
「ifは少なくしろ」
「構造体に16個も変数入れるな それ全部short int 1つで済む」
696デフォルトの名無しさん:2009/11/30(月) 22:07:31
無理矢理一行にしてみました。
idx=((i<j?(i^=j,j^=i,i^=j):i),i+j*N-((N+1)*N)/2);
697デフォルトの名無しさん:2009/11/30(月) 22:14:46
ポインタでわからない所があります。
mallocをした時以外はfreeをしなくてもよいのでしょうか?
698デフォルトの名無しさん:2009/11/30(月) 22:23:09
むしろ、してはいけません。
699デフォルトの名無しさん:2009/11/30(月) 22:23:24
>>697
calloc
realloc
strdup
asprintf
vasprintf
など
700デフォルトの名無しさん:2009/11/30(月) 22:34:21
>>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が何故無視なれないのでしょうか??
702701:2009/11/30(月) 23:22:25
>>701の2行目const charです。
703デフォルトの名無しさん:2009/11/30(月) 23:41:24
>>701
const char *p;
は、pが指している文字列の中身を変えられない。
(*pはchar型の定数)
pがどこを指すのかは変えられる。
704デフォルトの名無しさん:2009/11/30(月) 23:46:05
>>701
後置きインクリメントについて勉強してくれ。
705701:2009/11/30(月) 23:54:12
>>703>>704
解決しました。
706デフォルトの名無しさん:2009/12/01(火) 07:04:51
コンパイラしたときのOSじゃないとその
プログラムは動かないとか聞いたんだけど本当?
BCC使ってるんですがXPで作ったものはvistaや7じゃだめ?64bitだと動かないのは知ってる
707デフォルトの名無しさん:2009/12/01(火) 08:05:34
>>706
WindowsでビルドしたプログラムはLinuxで動かないとかそういうこと。
32bit XPでビルドしたプログラムなら、必要なものをちゃんと持ってい
けばVistaや7や64bit Windowsでも動くよ。
708デフォルトの名無しさん:2009/12/01(火) 10:43:11
>>706

世の中にはクロスコンパイラという物があってたくさん使われている
709デフォルトの名無しさん:2009/12/01(火) 12:04:33
コンパイルしたときのOSじゃなくてコンパイラ次第だな。
じゃないとDSとかWiiのゲームどうするんだよ。
710デフォルトの名無しさん:2009/12/01(火) 12:06:25
>>708
>コンパイラしたときのOS
「コンパイルしたときにターゲットとしたOS」のことでは?
711デフォルトの名無しさん:2009/12/01(火) 12:08:05
そういう意味ならそもそも質問してないと思うw
712デフォルトの名無しさん:2009/12/01(火) 12:08:15
ttp://www.dotup.org/uploda/www.dotup.org413142.c
前に作ったトリップ生成プログラムに継ぎ足す形で検索プログラムを作ってみたものの結果がどうもおかしいです
生成プログラムだけなら正しい結果を出力しているし環境も変えていないのですがなぜでしょうか?
713デフォルトの名無しさん:2009/12/01(火) 12:39:36
>>706
vistaで関数の動作が微妙に変わっちゃって、動かなくなったものもあるみたいだよ
714デフォルトの名無しさん:2009/12/01(火) 12:52:17
>>712
675に礼を言うのが先じゃねーのか?w
715デフォルトの名無しさん:2009/12/01(火) 13:03:30
>>714
そうでした・・・
お礼を忘れるなんて最低ですね・・・

>>675
あらためてご指摘ありがとうございました
716デフォルトの名無しさん:2009/12/01(火) 14:04:47
そういうのを考えるのが面倒だからJAVAや .Netみたいなものが出てきたんかなあ
717デフォルトの名無しさん:2009/12/01(火) 16:37:26
x09って\tでおk?
718デフォルトの名無しさん:2009/12/01(火) 16:47:04
>>717
質問は日本語かC言語でよろしく。
719デフォルトの名無しさん:2009/12/01(火) 16:52:20
#include <stdio.h>

int
main(void)
{
printf("%s\n", 0x09 == '\t' ? "おk" : "NG");
return 0;
}
720デフォルトの名無しさん:2009/12/01(火) 17:02:32
>>719
その発想はなかった...
721デフォルトの名無しさん:2009/12/01(火) 17:22:54
質問は「x09」であって「0x09」じゃないからそれは間違ってる
722デフォルトの名無しさん:2009/12/01(火) 17:48:34
コード体系に依存しないようにわざわざ \t なんてやってるのに。
723デフォルトの名無しさん:2009/12/01(火) 18:43:27


嘘臭いが本当な豆知識


Windowsは64bitOSでも意外と32bitピログラムが動くものだが

.NETを使って32bitOS上で組んだプログラムは 64bitOSでは動かない。


SDKにあるフラグ変更プログラムでフラグを立ててやらないと動かないのである。


724712:2009/12/01(火) 22:41:24
cygwinでコンパイル、実行していますが2バイト文字を正しく扱えないことがあるようです
なんだかそのせいで正しい結果が出ていないような気がするのですが代わりになるようなものありますか?
725デフォルトの名無しさん:2009/12/01(火) 22:42:19
疑うならてめえのソースを疑え
726デフォルトの名無しさん:2009/12/01(火) 22:43:02
64bit窓って型のサイズどうなってるの?
intは8バイト?
727デフォルトの名無しさん:2009/12/01(火) 22:46:58
んなわけねえだろ
728デフォルトの名無しさん:2009/12/01(火) 23:08:30
>>726
それは OS の仕様じゃなくて、コンパイラの実装の問題だから、
使ってるコンパイラ次第としか言いようがない。
729デフォルトの名無しさん:2009/12/01(火) 23:10:35
コンパイルオプションで選べるんじゃね?
char が signed と unsigned で選べるみたいに。
730デフォルトの名無しさん:2009/12/01(火) 23:15:22
int は 16 ビットなのが一番バランスが良い。
731デフォルトの名無しさん:2009/12/01(火) 23:16:34
64ビットWindows用のバイナリを作る処理系で、LLP64じゃない環境ってあるの?
OSが提供するヘッダファイルと型が合ってないと、システムコールも呼べないし
実質OSで決まるのでは?
732デフォルトの名無しさん:2009/12/01(火) 23:19:01
short と int と long が一部かぶってるのが気持ち悪い、と思う人と
short か long かは signed と unsigned のようにどちらかの省略であるべき、と思う人といるようだが
もまいらどっち?
733デフォルトの名無しさん:2009/12/01(火) 23:19:49
具体的に、どのコンパイラが出したどのバイナリがどうなってると言うんだ?
734デフォルトの名無しさん:2009/12/01(火) 23:27:04
>>731
誰もそんな話はしてないだろ。
735デフォルトの名無しさん:2009/12/01(火) 23:52:09
>>732
どっちって聞かれても、どちらにも当てはまらないんだが。
736デフォルトの名無しさん:2009/12/02(水) 00:02:45
実際は int の方が略されてるんだよな。
short int
long int
って。
だから int64 みたいな型名にはやたら腹が立つ。
じゃあそれは "int64 int" の略なのかよ、みたいな。
737デフォルトの名無しさん:2009/12/02(水) 00:15:56
たとえば
main()
{
return(0);
}
には short とも long とも書いてなく
気持ちの中ではむしろ char くらいだろ

int32 main()
は俺もやだ
738デフォルトの名無しさん:2009/12/02(水) 00:16:24
739デフォルトの名無しさん:2009/12/02(水) 00:17:12
なんで?
740デフォルトの名無しさん:2009/12/02(水) 00:22:21
float main()
なみに気持ち悪い
741デフォルトの名無しさん:2009/12/02(水) 00:30:41
>>740
mainの戻り値ってOSへのリターンコードでしょ?floatって許されるの?
742デフォルトの名無しさん:2009/12/02(水) 00:32:12
>>724
CygwinでASCII以外が扱えると思ってはいけない。
無料版のVisual StudioでC/C++を使ってください。
743デフォルトの名無しさん:2009/12/02(水) 00:32:18
>>736
short/int/longが16/32/64ビットのようなintがshortともlongとも違う環境のことをどうお考えで?
744デフォルトの名無しさん:2009/12/02(水) 00:35:48
>>723
x86/x64/Any CPU周りのことか?
745デフォルトの名無しさん:2009/12/02(水) 00:35:59
戻り値の型を略したら暗黙でintを指定した事になる。
746デフォルトの名無しさん:2009/12/02(水) 00:40:29
さっさとビット幅と呼称を統一しろよ。移植性を阻害する大きな要因なんだから。
747デフォルトの名無しさん:2009/12/02(水) 00:45:06
>>741
5.1.2.2.1 Program Startup の 1 でおkとされている
748デフォルトの名無しさん:2009/12/02(水) 00:50:31
>>746
<stdint.h>で我慢してください。
個人的には、このたびやっとVCにもやってくるのが嬉しい。
749デフォルトの名無しさん:2009/12/02(水) 00:54:21
そんなの無くても limits.h でいいだろ。
750デフォルトの名無しさん:2009/12/02(水) 01:04:52
>>746
プッ
751デフォルトの名無しさん:2009/12/02(水) 01:31:01
>>724
--input-charset とか --exec-charset とかそういうのがあるはず
752デフォルトの名無しさん:2009/12/02(水) 01:45:40
テキストファイルにはASCII以外は入れるなよ。
ASCII以外が入ってたら
そりゃもうバイナリファイルだろ。
753デフォルトの名無しさん:2009/12/02(水) 01:51:27
おまえは意味がわかってて言ってんの?
いやわかってないよな?
なぜそんな事を言った?
754デフォルトの名無しさん:2009/12/02(水) 09:25:40
>>752は2バイト文字の読めない外国人
755デフォルトの名無しさん:2009/12/02(水) 13:09:25
EBCDICではテキストファイルは作れないとか
756デフォルトの名無しさん:2009/12/02(水) 17:06:31
指定したhwndの標準入力に送るって関数教えて
757デフォルトの名無しさん:2009/12/02(水) 17:09:54
そんなものは無い
hwndの持ち主のプロセス探してパイプ作って送ってやればいいかもしれないが
送られた方では関知しないであろう。もっと具体的に何がしたいのか。
758デフォルトの名無しさん:2009/12/02(水) 17:26:53
標準入力はウィンドウじゃなくてプロセスが所持。
ちなみにメッセージキューはスレッドが所持。
759デフォルトの名無しさん:2009/12/02(水) 17:58:40
ところで、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;
}
760デフォルトの名無しさん:2009/12/02(水) 18:00:49


だからよ
int8
int16
int32
int64

こういうふうに型を決めればいいのに何でやらないのか。


761デフォルトの名無しさん:2009/12/02(水) 18:05:15
っ <stdint.h>
762デフォルトの名無しさん:2009/12/02(水) 18:05:50
1 バイトが 8 ビットとは限らないだろボケ
763デフォルトの名無しさん:2009/12/02(水) 18:06:03
>>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;
}
764デフォルトの名無しさん:2009/12/02(水) 18:07:31
>760
移植性がなくなるからです

全ての環境でint64が用意できるとは限りません
char <= short int <= int <= long int
としておけば、少なくともcharと同じ大きさかそれ以上の大きさであれば良いので
移植性があります

もしかして、int64は、64bitではないということか
765デフォルトの名無しさん:2009/12/02(水) 18:08:02
だから、7ビットだの9ビットの処理系は除く。

サポートしなきゃいい。

ロシアや中国の計算機に多いが
いいだろ
766デフォルトの名無しさん:2009/12/02(水) 18:12:26
それなら別に型のサイズ決め打ちにすればいいんじゃね
サポートしなくていいんだから
767デフォルトの名無しさん:2009/12/02(水) 18:13:56
UNIX が生まれた PDP-7 は 18 ビットなんだぜ?
そうなると標準は
int18
になるわけだけど、それで良いのか?
768デフォルトの名無しさん:2009/12/02(水) 18:20:56
組み込み系が死屍累々になりそうだ
769デフォルトの名無しさん:2009/12/02(水) 18:23:57
ビット長に極端に依存するコードしか書けないヤツは
Java とかに行ったほうがいいんじゃね?
むいてないよ。
770デフォルトの名無しさん:2009/12/02(水) 18:29:43
printf("数値を入力してください>");scanf("%d",&a);
printf("演算子を入力してください>");scanf("%c",&c); ←この行のscanf
printf("数値を入力してください>");scanf("%d",&b);
    
と記述すると上記の位置のscanfがスキップされて3行目のprintfが処理されてしまいます
上記の行を最初に持って来ると問題なく動くんですが
他に解決法は有りませんでしょうか?
771デフォルトの名無しさん:2009/12/02(水) 18:36:31
スキップされてないとおもうよ。
772デフォルトの名無しさん:2009/12/02(水) 18:39:13
数値を入力してください>6
演算子を入力してください>数値を入力してください>
になります
773デフォルトの名無しさん:2009/12/02(水) 18:45:08
scanfは、改行コードを受け取るので
1発目のscanfで何か入力したあとにリターンキーを押すと

入力した文字や数字
+
リターンコード

と、二回に分けて受け取るために2発目のscanfにはリターンコードが入り、
「なんじゃこりゃ分からん」ってことで処理されてないように見えるだけである。

これを防ぐには、
標準入力から受けとっているなら
fflush(stdin)とか挟むとよい

しかし、これは規格外の使い方である。
774デフォルトの名無しさん:2009/12/02(水) 19:05:26
" %c" にすれば改行とか空白を読み飛ばしてくれたと思う
775デフォルトの名無しさん:2009/12/02(水) 19:11:25
gets 使えよ。便利だから。
プログラミングの勉強するのに
scanf の仕様とかどうでもいい部分で躓いてたらつまらないだろ。
776デフォルトの名無しさん:2009/12/02(水) 19:12:56
fflush(stdin)で入力バッファがクリアされる処理系があるんだ
Windows?
777デフォルトの名無しさん:2009/12/02(水) 19:16:49
>>775
初心者乙
778デフォルトの名無しさん:2009/12/02(水) 19:25:32
>>777
779デフォルトの名無しさん:2009/12/02(水) 20:04:05
780デフォルトの名無しさん:2009/12/02(水) 20:36:18
>>775
gets() でとてつもない長い一行を入力されたあかつきには、バッファオーバーランがまって降ります。
scanf() の安全パターンか、fgets() を使うべき、って大昔から散々いわれているのですけれどもね。
781デフォルトの名無しさん:2009/12/02(水) 20:41:08
gets()使ってる所でオーバーフロー起こしたら、それは
オーバーフロー起こした使用者が悪い
782デフォルトの名無しさん:2009/12/02(水) 20:43:00
scanfって、マイクロソフトの _s 系以外
「引数として」サイズ指定出来るもんないんだっけ?

783デフォルトの名無しさん:2009/12/02(水) 20:46:29
>>782
%.*s
784デフォルトの名無しさん:2009/12/02(水) 21:00:23
>>781
使用者のせいにするのでは、あなたには成長、進歩などの言葉は無縁でしょうね。
785デフォルトの名無しさん:2009/12/02(水) 21:02:34
1Gバイトぐらいのバッファ確保しとけば
786デフォルトの名無しさん:2009/12/02(水) 21:08:58
子供か
787デフォルトの名無しさん:2009/12/02(水) 21:22:50
ちょっとした練習のためのプログラムにバッファオーバーもくそもあるかよ。
お前は雑誌のサンプルプログラムに、
いちいち、戻り値のチェックしてないだの文句付けるのか?
788デフォルトの名無しさん:2009/12/02(水) 21:27:55
スクリプト言語使えよ。便利だから。
プログラミングの勉強するのに
バッファオーバーフローどうでもいい部分で躓いてたらつまらないだろ。
789デフォルトの名無しさん:2009/12/02(水) 21:29:22
はいはい Ruby は最高 Ruby は最高
790デフォルトの名無しさん:2009/12/02(水) 21:31:59
>>787
そんな甘い考えでは、大事な本番でしくりますよね。
791デフォルトの名無しさん:2009/12/02(水) 21:33:06
>>787
当然文句付ける。それが悪習慣になって他のプログラマに迷惑掛けるからな。
792デフォルトの名無しさん:2009/12/02(水) 22:00:07
gets()じゃ数値を入力するときに一々変換しなきゃいけないから、
scanf()より初心者に向いてるとは言いがたい。
793デフォルトの名無しさん:2009/12/02(水) 22:10:32
>>787
「ちょっとした練習」なら個人で、ここ以外で好きにすればいい。
ポイントは、入門者が悪習を身に付けないように気を配ろう、というだけの事なんだが?
794デフォルトの名無しさん:2009/12/02(水) 22:13:09
なにを言っても無駄
795デフォルトの名無しさん:2009/12/02(水) 22:15:07
本人には、無駄かもな。
これから勉強しようという者には参考になる。
796デフォルトの名無しさん:2009/12/02(水) 22:23:25
そもそも「キーボード」から入力したいなら conio 使えよ。
出力もな。
797デフォルトの名無しさん:2009/12/02(水) 23:00:46
>>792
つかscanf()のほうこそ挙動が独特で、初心者がはまってるだろ。

scanf()は使いこなせばいいって言うやついるけど、時間かけて
挙動を理解しても、本番じゃまず使わないし、最初からfgets()使ったほうが
なんぼかいい。
798デフォルトの名無しさん:2009/12/02(水) 23:08:46
読み方は「コニオ」で合ってる?
799デフォルトの名無しさん:2009/12/02(水) 23:12:20
音声言語ではないから「読み」などというものは存在しない。
conio は、ただ conio なのである。
800デフォルトの名無しさん:2009/12/02(水) 23:16:54
俺はコンアイオーって読んでる
801デフォルトの名無しさん:2009/12/02(水) 23:43:09
俺はコニオだな。
802デフォルトの名無しさん:2009/12/02(水) 23:44:21
>>788
( ´,_ゝ`)プッ
803デフォルトの名無しさん:2009/12/02(水) 23:53:39
くにお
804デフォルトの名無しさん:2009/12/02(水) 23:56:08
>>802
2ch初心者?
805デフォルトの名無しさん:2009/12/03(木) 00:01:54
>>784
はいはいそう思ってて下さい
俺は宿題程度にはgets()で十分だと思っている
業務用のプログラムには絶対使わないが
要するにケースバイケースという事だ

そんな事も分からないお前こそ進歩がないな
806デフォルトの名無しさん:2009/12/03(木) 00:07:53
fgets()使えばいいじゃん。
少しタイプ量が増えるくらいだし。
807デフォルトの名無しさん:2009/12/03(木) 00:15:50
> 業務用のプログラムには絶対使わないが
> 要するにケースバイケースという事だ

練習サボる奴ほど「本番ではすごいんだぜ」って言うんだよな。
808デフォルトの名無しさん:2009/12/03(木) 00:18:17
>>806
うるせーないちいち
そんな事は言われなくてもわかってんだよ
それでも敢えてgets()を使うんだよ
809デフォルトの名無しさん:2009/12/03(木) 00:20:12
入門者の邪魔だな。
810デフォルトの名無しさん:2009/12/03(木) 00:20:53
馬鹿に何を言っても無駄
811デフォルトの名無しさん:2009/12/03(木) 00:26:22
>>806
改行文字外したりとか面倒臭いだろ。
812デフォルトの名無しさん:2009/12/03(木) 00:30:22
>>807
その練習する部分と関係ないとこでムキになっても仕方ないだろ。
単にバットの素振りするだけなのに
バッターボックスの中じゃないと振らないやいとか駄々こねるのか?
813デフォルトの名無しさん:2009/12/03(木) 00:41:16
初心者や不特定の人間にgetsを教えるな、って事だろ
危険性も一緒に教えるならいいが、直でソースに組み込みかねない
814デフォルトの名無しさん:2009/12/03(木) 01:07:17
>>812
例えが全く理解できない
815デフォルトの名無しさん:2009/12/03(木) 01:42:54
こういうのに限って、俺の例えはわかりやすい、と自賛してそう
816デフォルトの名無しさん:2009/12/03(木) 01:53:37
必死すぎるw
817デフォルトの名無しさん:2009/12/03(木) 01:58:38
ほんと、必死こいてgetsを使うキチガイって何なの?
818デフォルトの名無しさん:2009/12/03(木) 01:59:07
どうせfgets()しか使わなくなるんだから、最初からfgets()だけを学べばいいじゃない。
scanf()とか覚えても無駄だよ。
819デフォルトの名無しさん:2009/12/03(木) 02:10:54
*scanf()を使わずに、fgets()を使って
PGM Format(MIME:image/x-portable-greymap)のヘッダを解析するプログラムを書いてみてください
820デフォルトの名無しさん:2009/12/03(木) 02:17:05
いいえ
821デフォルトの名無しさん:2009/12/03(木) 02:21:46
MSのソケットの例プログラムですらちゃんとしてたぜ?
822デフォルトの名無しさん:2009/12/03(木) 08:03:33
strstr関数使ったら問題が発生しましたってエラーが出るんだが
意味わからん
823デフォルトの名無しさん:2009/12/03(木) 08:07:32
俺にもわからん
824デフォルトの名無しさん:2009/12/03(木) 08:11:35
第一引数はchar*第二はchar配列の変数戻り値は取得してない
825デフォルトの名無しさん:2009/12/03(木) 08:26:10
どうせstrstr()じゃなくて、別のところがバグってんだろw
826デフォルトの名無しさん:2009/12/03(木) 08:35:20
+=と=+
ってどう違うの?
827デフォルトの名無しさん:2009/12/03(木) 09:33:39
>>826
給与 += 10000;
給与 = +10000;

全然違う!
828デフォルトの名無しさん:2009/12/03(木) 09:57:45
+=は一つにまとめて独自の意味があるが、=+は=と+が並んでるだけ。
829デフォルトの名無しさん:2009/12/03(木) 10:06:15
>>827
その2つの例えは私にとって同じことを示しているように思うのですが
私はどこで間違ったのでしょうか?
830デフォルトの名無しさん:2009/12/03(木) 10:12:55
>>829
上は追加で、下は上書きだ。
10000 と +10000 は同じだぞ
831デフォルトの名無しさん:2009/12/03(木) 10:43:09
a+=10; は a = a + 10;
a=+10; は a = 10;

どこが同じに見えるんだかw
832釣られてみる:2009/12/03(木) 10:59:16
その昔、a =+ 10 と書いて a += 10 と同じように解釈したコンパイラがあったそうな。
833デフォルトの名無しさん:2009/12/03(木) 11:42:00
>>830>>831
俺は>>829じゃないけど
おそらく給与==\0っていうジョークだろ
834デフォルトの名無しさん:2009/12/03(木) 11:59:50
'\0' だろ。
835デフォルトの名無しさん:2009/12/03(木) 12:06:26
この場合の\は円の意味だろ
836デフォルトの名無しさん:2009/12/03(木) 12:10:46
バックスラッシュが?
837デフォルトの名無しさん:2009/12/03(木) 12:19:12
無給ということだろうけど、無職ではない
838デフォルトの名無しさん:2009/12/03(木) 12:22:56
共に未初期化として
unsigned 給与; なら
給与 =+10000; は夢がないし

int 給与; に
給与 += 10000; されたら人生掛ける感じだな
839デフォルトの名無しさん:2009/12/03(木) 12:26:20
>>805
最近の宿題の条件をみると、fgets() 使え、というのがわりに多いのですが。
それにgets() の気持ち悪さを理解できないようではセンスがない。
840デフォルトの名無しさん:2009/12/03(木) 13:00:22
まだ続けるのか。
自分しか入力しないようなものに
ガチガチのセキュリティなんか組み込んでも意味無いだろ。
841デフォルトの名無しさん:2009/12/03(木) 13:04:31
Javaでいうところのdepilated(推奨されない)な関数なんじゃね?
842デフォルトの名無しさん:2009/12/03(木) 13:14:23
>>840
fgets使ったところで、たいして手間は増えないだろ。
20年以上前から、すでにfgets推奨が定石だったのに、なぜgetsにそこまでこだわるのか。
843デフォルトの名無しさん:2009/12/03(木) 13:24:46
>>841
辞書で頭殴って子ね
844デフォルトの名無しさん:2009/12/03(木) 13:56:23
他人が口出すのがおかしい
845デフォルトの名無しさん:2009/12/03(木) 14:03:10
他人に教えるときはgetsにするなというだけでしょうに
846デフォルトの名無しさん:2009/12/03(木) 14:04:53
depricatedじゃなくて
deprecatedね
rも抜けてたけど
847デフォルトの名無しさん:2009/12/03(木) 14:18:54
>>832
古い HP-C で泣いた覚えがw
しかも "= +" と書くと、警告出るんだよ。
「"+" は要らんやろ。足したいなら空白をあけず "=+" と書けや。」
848デフォルトの名無しさん:2009/12/03(木) 14:21:20
>>846
rが抜けてたどころか、いらんlが入ってるし、cも抜けてるじゃねーかw
849デフォルトの名無しさん:2009/12/03(木) 17:18:10
やりとりを見ていて気がついたのは、
「スレの趣旨から言って、入門者も見ることを意識している者」と
何故か「自分の好みに口出しをされていると思い込んでいる者」との違い。
まあ、このスレに限った事じゃないが。
850デフォルトの名無しさん:2009/12/03(木) 17:34:21
いや、バカの一つ覚えを毎回書くやつにうんざりしてるんだろw
851デフォルトの名無しさん:2009/12/03(木) 17:53:01
バカの一つ覚え(笑)
基本的なことなのにね(爆)
852デフォルトの名無しさん:2009/12/03(木) 18:00:51
それくらいしか言うことできないから得意になって指摘してるんだよな。
853デフォルトの名無しさん:2009/12/03(木) 18:06:46
まだ言ってる(笑)
854デフォルトの名無しさん:2009/12/03(木) 18:21:07
>>853
このスレで荒らしの出番はありません
お引取りを
855デフォルトの名無しさん:2009/12/03(木) 18:24:47
俺は荒らしじゃないよ。バカ
856デフォルトの名無しさん:2009/12/03(木) 18:25:19
gets() 薦める奴はセンスがない、ってことで。
857デフォルトの名無しさん:2009/12/03(木) 18:28:38
>>856
ちゃんと適切に説明すればいいのに
>>775みたいな書き方するから荒れるんだよなー
858デフォルトの名無しさん:2009/12/03(木) 22:54:57
スルースキル検定が必要な日がやってこようとは!
859デフォルトの名無しさん:2009/12/03(木) 23:52:23
さすがハイセンス(笑)なやつは一味も二味も違うなw
860デフォルトの名無しさん:2009/12/04(金) 02:58:13
>>849
多分違う。
後者はgetsでいいよ派を指していると思うが、彼等の言い分はこうだ。
「初心者にfgetsなんて難しいものを進めるのはおかしい。」
861デフォルトの名無しさん:2009/12/04(金) 02:58:56
ああ、誤字とかないわ俺
862デフォルトの名無しさん:2009/12/04(金) 04:48:09
ずっと考えてるんですがわからないんで誰か教えてください・・・

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;
}
863デフォルトの名無しさん:2009/12/04(金) 05:05:53
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;
}
864デフォルトの名無しさん:2009/12/04(金) 07:45:54
よくわからんけど、
(*array3)[i][j][k]
じゃないの?
865デフォルトの名無しさん:2009/12/04(金) 08:21:31
mallocが多いな
1回で全て確保しちゃいなよ
866デフォルトの名無しさん:2009/12/04(金) 10:41:39
>>862
malloc の戻り値チェックしてない。
再提出。
867デフォルトの名無しさん:2009/12/04(金) 10:46:31
864で答え出てるのに、どうでもいいとこ穿り返すアホはなんなんだ
868デフォルトの名無しさん:2009/12/04(金) 10:59:56
二次元以上の配列を使用する場合は非malloc領域にそれを置くのが
賢明。ただし一般にサイズがでかいのでグローバル変数に
するのが普通。
869デフォルトの名無しさん:2009/12/04(金) 11:04:20
二次元配列に戻ってみれば自力でわかる
わからなければ一次元で
どうしてそういうのは実験しないかなあ
870デフォルトの名無しさん:2009/12/04(金) 11:10:38
理解しにくければ無理に引数で渡さないで、戻り値で返せばいいのに。
871デフォルトの名無しさん:2009/12/04(金) 12:25:13
>>863のような直方体を充填するような多次元配列なら
int* data = (int*)malloc(sizeof(int)*row*column*oku);
data[i*column*oku + j*oku + k];
みたいに一次元配列で代用したほうが簡単じゃね?
872デフォルトの名無しさん:2009/12/04(金) 12:29:23
キャストすんなうぜえ
873デフォルトの名無しさん:2009/12/04(金) 12:30:13
残念ながら世の中はそうそう勝手に決められないんだよな
それが。猿段階で思いつくようなことを得意になってア
ドバイスされるとエラくムカつくことがあるな。
874デフォルトの名無しさん:2009/12/04(金) 12:49:37
予め○○は変更できませんとか条件を提示して質問すればいいだけのことだろ
猿じゃければ簡単なはず
875デフォルトの名無しさん:2009/12/04(金) 12:51:03
変なところで改行されてると縦読みを探してしまう
876デフォルトの名無しさん:2009/12/04(金) 12:55:52
電子メールでプロポーショナルフォント使って横幅を揃えようとするやつってなんなの?
受信者が同じフォントとは限らないって教えてやったほうがいいのか?
変なところで改行されてて、読みにくいったらないんだけど。
一部を引用しようとすると余分な文字がくっついてくるし。
877デフォルトの名無しさん:2009/12/04(金) 13:00:08
メール本文をビットマップ画像オヌヌメ
878デフォルトの名無しさん:2009/12/04(金) 13:31:42
>>873
猿みたいな質問してるんだから最後まで土下座しろよな
879デフォルトの名無しさん:2009/12/04(金) 13:35:01
・試さない
・調べない
・何を知りたいのか口を割らない
・偉そうにされたくない
880デフォルトの名無しさん:2009/12/04(金) 13:37:38
873は元の質問者とは何の関係もない、だたの猿だろw
881デフォルトの名無しさん:2009/12/04(金) 13:55:06
アイちゃんより低能な猿さん乙
882デフォルトの名無しさん:2009/12/04(金) 14:00:24
何でも試せるんだと考える。
何でも調べればわかるんだと思う
何を知りたいのかがわかるのが当たり前だと思う
偉そうにしたい

裏返しただけだが...
883デフォルトの名無しさん:2009/12/04(金) 14:15:24
改行と折り返しはちゃんと区別しろよな。
折り返しをするのはあくまでビュワの仕事だろ。変なとこで改行文字を入れて折り返し擬きをするんじゃねえよぼけ。
読む人が自分と同じビュワ使ってるとか思ってんじゃねえよカス。
884デフォルトの名無しさん:2009/12/04(金) 15:16:24
なんで配列へのポインタ参照には&つけないといけないの?
アドレス値は同じだろ?
885デフォルトの名無しさん:2009/12/04(金) 15:17:55
アドレス値は同じとは限らないし
&を付けなければならないとも限らない
886デフォルトの名無しさん:2009/12/04(金) 16:51:40
>>860
gets() 薦めるくらいなら、限定して *scanf() 薦めたほうがまだましかと。
887デフォルトの名無しさん:2009/12/04(金) 16:52:57
>>867
アンカーの使い方しらない?
888デフォルトの名無しさん:2009/12/04(金) 22:08:26
あったかいよ
889デフォルトの名無しさん:2009/12/04(金) 22:18:01
電気あんかー
890デフォルトの名無しさん:2009/12/04(金) 22:34:14
ポインタだよ。
891デフォルトの名無しさん:2009/12/04(金) 23:22:55
>>886
*scanf?scanf以外は難しいから薦めないに決まってる。
892デフォルトの名無しさん:2009/12/04(金) 23:28:13
お前はそれでいい
893デフォルトの名無しさん:2009/12/05(土) 04:02:35
>>886
ちゃんと
(*scanf)( );
こういうふうに括弧付けて書かないと駄目だろ。
*scanf( ); だと
*(scanf( )); になるぞ。
894デフォルトの名無しさん:2009/12/05(土) 04:45:08
この場合の*はワイルドカードじゃなかろうか
895デフォルトの名無しさん:2009/12/05(土) 07:41:35
ネマレ
896デフォルトの名無しさん:2009/12/05(土) 08:48:00
理解した上でのレスであろう
897デフォルトの名無しさん:2009/12/05(土) 09:22:57
理解してるようには見えませんw
898デフォルトの名無しさん:2009/12/05(土) 09:49:07
>>883
電子メールは、80文字くらいで改行入れるって昔からのしきたりだろ。
899デフォルトの名無しさん:2009/12/05(土) 09:51:22
subject に日本語使っても文句言わないで
900デフォルトの名無しさん:2009/12/05(土) 09:56:00
日本語自体が問題というわけではないでしょうに
901デフォルトの名無しさん:2009/12/05(土) 12:19:05
文字配列の一部を上書きしたいんだけど
上書きするための文字列のバイト長が異なるからmemcpyが使えない
なんかいい関数無いの?
902デフォルトの名無しさん:2009/12/05(土) 12:49:20
>一部を上書き

するんだから

>文字列のバイト長が異なる

のは当たり前じゃね?
903デフォルトの名無しさん:2009/12/05(土) 12:50:44
えっ?
904デフォルトの名無しさん:2009/12/05(土) 12:52:48
一部を上書きするだけなら、memcpyのサイズを上書きする文字列のサイズにすればいいだけじゃ?
905デフォルトの名無しさん:2009/12/05(土) 12:55:56
>>901 の日本語がひどすぎる件。
まず日本語の勉強から始めろよ。
906デフォルトの名無しさん:2009/12/05(土) 13:02:24
うるせー。
解答できないなら書き込むんじゃねーよ。
二度と来るな。ザマァwww
907デフォルトの名無しさん:2009/12/05(土) 13:03:28
自演してまで>>901を叩きたいの?
908デフォルトの名無しさん:2009/12/05(土) 14:00:36
すみませんVisual C++で以下のプログラムをデバッグしました。

#include<stdio.h>
int main(void){
printf( "\x1b[0;36m" );
printf( "abc\n" );
}
実行結果は水色の字で  abc     と表示されると思ったのですが
実際は            [0;36mabc  と表示されます。
C++ではprintf("\x1b〜 で操作ができないんでしょうか?
909デフォルトの名無しさん:2009/12/05(土) 14:08:26
できます。
910デフォルトの名無しさん:2009/12/05(土) 14:13:04
>>908
C++ だからではなくて、端末の問題。 cmd ではダメ。command.com ではどうですか?
911デフォルトの名無しさん:2009/12/05(土) 14:14:15
>>908
古い手段で現在のWindowsの流儀に沿っていない。ANSI.SYSという
DOSの頃からあった標準添付ドライバをconfig.sysに設定しC:¥に置くとかそんなやり方で対応できたっけな Windows 2000の頃までなら
XP以降でそれで出来るかどうかは知らない。
システムフォルダーにANSI.SYSを検索して無ければそのやり方
(エスケープシーケンス)出来ないと思ったほうがいい。
912デフォルトの名無しさん:2009/12/05(土) 14:22:40
>>908
やらないほうがいい
VC++はWindows専用の
GUIアプリを作るもので、
コンソールアプリには
適していない。
913デフォルトの名無しさん:2009/12/05(土) 14:29:53
>>900
だが Outlook Ekusopress のエンコードには問題ががが

>>901
バイト長が異なるなら、それは上書きと呼べるのかどうか…
"ABCDxxxEFG" → "ABCDyyyyyEFG" なら、
1. "EFG" を memmove で移動。
2. "xxx" の先頭から "yyyyy" を memcpy で書き換え。
914デフォルトの名無しさん:2009/12/05(土) 14:30:42
>>912
頭沸いてんのか…?
915910:2009/12/05(土) 14:32:20
>>914
できないものはできないのですけれども。
916908:2009/12/05(土) 14:47:09
みなさん、ありがとうございます。
プログラミングは様々な事を考慮しないといけないので難しいですね…
今回は飛ばして次の事を勉強してから、また文字の色を変えたくなった時に改めて調べてみます。
917デフォルトの名無しさん:2009/12/05(土) 15:04:23
C言語でJPEGなどの画像をテキストと一緒に表示させるにはどのようなプログラムを組んだらいいですか?
プラグインは使わない方向で教えていただけませんか?

918デフォルトの名無しさん:2009/12/05(土) 15:10:55
Unix系かWindowsかで変わる
まぁ、レイヤーとなるライブラリを挟めばクロスプラットフォームなプログラムを作ることはできる
Qt, wxWidgets, SDLなど
919デフォルトの名無しさん:2009/12/05(土) 15:12:21
>>915
コンパイラの問題ではないし、そもそも C の範疇ですらない。
Windows のコンソールウィンドウを使う以上、ANSI エスケープシーケンスが
使えると思うほうが間違っている。
920912:2009/12/05(土) 15:29:44
>>919
間違いとまでは言わないが、Webブラウザが軽く起動出来た上
手軽にアプリに内蔵できるOSで、ソーメン流しみたいに
コンソールに出力させる開発方法はレガシーだろな。
921デフォルトの名無しさん:2009/12/05(土) 15:53:36
>>917って標準以外のライブラリのことをプラグインと言っている気がするなぁ。
気のせいだといいんだけど。
922デフォルトの名無しさん:2009/12/05(土) 16:06:34
C#と同等のことを何とかC言語で使うことができないだろうか
923デフォルトの名無しさん:2009/12/05(土) 16:15:43
フロントエンド
924デフォルトの名無しさん:2009/12/05(土) 16:17:40
>>913
そういう意味かよw
925デフォルトの名無しさん:2009/12/05(土) 18:18:48
ちょっと質問というか,最近の開発動向を聞きたいのですが
winコンソールアプリってwmain等,wchar_tに対応してるじゃないですか
それで最近はもうunicodeに対応してるのが当たり前で
これからは全部unicodeでやりましょうねって風潮があると思うんですけど
クロスプラットフォーム環境で開発しようと思うと
unixとかlinuxだとunistd.hとかの環境標準関数群がwcharに対応してなくて
いちいち変換するのが二度手間なんですけどそれでも対応した方がいいんでしょうか
unicodeで統一するよりもマルチバイトを基本に必要なときだけwchar_tにした方が
スマートな気がするのですが、世の中はどうしてunicodeで統一する流れになっているのでしょうか?
926デフォルトの名無しさん:2009/12/05(土) 18:21:18
>>925
TCHAR でも使っておけばいいんじゃない?
927デフォルトの名無しさん:2009/12/05(土) 18:39:16

sprintf(buffer, "%f", 1.234);
これでbufferに出力する小数の桁数を調整するには
どうすればよいですか?
928デフォルトの名無しさん:2009/12/05(土) 18:41:00
>>926
TCHARはよけい面倒。
929デフォルトの名無しさん:2009/12/05(土) 18:41:01
誤解してるみたいだが
Unicode ←対義→ マルチバイト
じゃないからな。
ワイド ←対義→ マルチバイト
だからな。
Unicode はマルチバイトもワイドもどちらもある。
UTF8 はマルチバイトだし、UTF16 はワイド。
930デフォルトの名無しさん:2009/12/05(土) 18:43:11
うーむということは
例えばgetoptとかを使う場合
使う前にTCHARがwchar_tだったら変換する
っていう処理を入れるってことですかね

他に例えば
char test[128];
strcat(test,argv[0]);
だったのをunicodeに対応するとwcscatを使ってたのですが
TCHARを使おうと思うとTCHAR型に対応した関数を自分で作る必要があるってことでしょうか
それでその関数内でTCHARがどっちか判別してstrなのかwcsなのか使い分けるって感じなんでしょうか

自分は趣味のアマグラマなんですけど
プロの人はこうやって書いてるんでしょうか

>>929
すみませんそのへんはごっちゃになってました
931デフォルトの名無しさん:2009/12/05(土) 18:44:41
TCHAR は Win9X 系と WinNT 系でソースを共有するためのものだろ。
もう今となっては使う意味は無いよ。
932デフォルトの名無しさん:2009/12/05(土) 18:46:34
933デフォルトの名無しさん:2009/12/05(土) 18:50:27
>>931
95系とNT系が混在してた時期でも、ほとんど機能してなかっただろうしな > TCHAR
934デフォルトの名無しさん:2009/12/05(土) 19:00:12
てことはwchar_tで書いてwchar_tに対応してない関数を使う時だけcharに変換する
もしくはwcharに対応したラッパ関数を自分で書く
っていうのがスタンダードなんですね,ありがとうございます.

チラ裏ですが今書いてる物に限れば,非専門の人でも読めるようにしたくて
そのうえでwchar_tくらいはいいだろうと思っていたのですが
wchar_tの変換やラッパ関数が増えると混乱させそうなので
全部charで書き直したいと思います

といった経緯でwchar_tに対応しないシステムが作られ続けるんですね・・・
935デフォルトの名無しさん:2009/12/05(土) 19:04:52
>>934
TCHAR系はただのマクロ
__UNICODE__ の有無で
関数を置き換えてくれるよ
936デフォルトの名無しさん:2009/12/05(土) 19:05:46
>>932
ありがとうございます。
937デフォルトの名無しさん:2009/12/05(土) 19:16:16
今問題にしてるのは呼び出される時じゃなくて呼び出す時で
それで呼び出し対象関数がだぶちゃに対応してないってことだろ
それならTCHARでの対応は無理じゃね?
938デフォルトの名無しさん:2009/12/05(土) 19:23:39
TCHARはtypedefされてるから
ちゃんと書き直さないと型判定エラー出るから置き換えてはくれない記憶が
939デフォルトの名無しさん:2009/12/05(土) 19:26:27
> プロの人はこうやって書いてるんでしょうか
基本的に全部charかな。
wchar_tとかほとんど使わない。
940デフォルトの名無しさん:2009/12/05(土) 19:52:52
>>925
>unixとかlinuxだとunistd.hとかの環境標準関数群がwcharに対応してなくて
wchar_t がない…だと?
捨ててしまえ、そんなゴミ環境。
941デフォルトの名無しさん:2009/12/05(土) 20:16:06
え?そらだって、普通UTF-8使ってるからだろ。
システムコールでwcharに対応する必要ってあんまり無いじゃん。

wchar_tという型の定義自体が無い訳は無いと思うよ。
942デフォルトの名無しさん:2009/12/05(土) 20:30:45
>>940
VC++も対応してないぞ。ファイル入出力。
STLでも対応してないぞ。fstreamのwstring版はない。
943デフォルトの名無しさん:2009/12/05(土) 20:32:49
根本的な問題なんだろ。linuxのせいではなく
C標準化団体がwchar_tのファイル入出力を規定しないから
いつまでたっても、charでやることになる。
環境依存してしまう辛菜。
944デフォルトの名無しさん:2009/12/05(土) 20:36:05
>>942
fstream系でconst wchar_t*でファイル名の引数を受け取るやつはVC++独自で存在するぞ。
それがなかったとしても、HANDLEで入出力するようなストリームバッファ・ストリームクラスの派生を作るという手もあるし。
945デフォルトの名無しさん:2009/12/05(土) 20:37:39
長いパスが扱えない以外に問題は出ない気がするがな。
実際にwindowsのフォルダ名、ファイル名は、CP932 = SJISだが
使っていて不具合でないだろ。
長いパスさえ、linuxで動作可能な標準のCで扱う方法もある。
カレントディレクトリを、260文字以内ずつ移動していって、ファイル元にたどり着いてから作業すればいい。
946デフォルトの名無しさん:2009/12/05(土) 20:39:36
>>944
それつかう位なら、windows.hで使えるCreateFileをつかうだろ。意味なし。他のコンパイラで動かないし
947デフォルトの名無しさん:2009/12/05(土) 20:43:19
>>944
独自でなくて、標準関数が両方を受け付けるっていう意味だったんだ。
948デフォルトの名無しさん:2009/12/05(土) 20:45:00
>>945
> 実際にwindowsのフォルダ名、ファイル名は、CP932 = SJISだが
それは違う。Windows 95/NTのLFNなFATのときからUnicodeだった。
(Win9xのAPIではマルチバイト文字でしか扱えなかったけど)
949デフォルトの名無しさん:2009/12/05(土) 20:46:34
確かにunicodeの制御文字列使ったウィルスとか地味に流行ったな
950デフォルトの名無しさん:2009/12/05(土) 20:47:22
内部の処理がUTF16LEなだけでは。UTF16LEのファイル名を出力するとバグった気がする。
951デフォルトの名無しさん:2009/12/05(土) 20:50:44
CreateFileW使っても、実際に保存するにはCP932にしている気がするし
windowsでファイル名の文字コードを変換するにはどうすればいい
952デフォルトの名無しさん:2009/12/05(土) 20:57:41
>>951
ファイル名にunicodeにしかない文字使えるし、unicodeなんじゃね?
953デフォルトの名無しさん:2009/12/05(土) 21:12:02
954デフォルトの名無しさん:2009/12/05(土) 21:14:51
>圧縮ツールは一般的にファイル名を Shift_JIS(CodePage 932)で保存を行います。
これはwindowsじゃなくてツールが一般にunicodeに対応してないってことじゃね
955デフォルトの名無しさん:2009/12/05(土) 21:19:35
unicodeじゃなかったら、おれのPCのデスクトップにある
€.txt てファイルはどうなってるんだ。
956デフォルトの名無しさん:2009/12/05(土) 21:23:18
>>953
全然そんなこと書いてないんだが。
957デフォルトの名無しさん:2009/12/05(土) 21:30:43
どうやら標準はunicodeだが、地域と言語オプションで各国に特化できるようだ。
日本で標準設定で使うとCP932になって、それ以外だとunicode表示らしい。
958955:2009/12/05(土) 21:33:36
俺のPCのwindowsも日本語版で、とくになにもいじってないけどunicodeにしかない文字が使えてるよ?
959デフォルトの名無しさん:2009/12/05(土) 21:34:18
ファイル名に ASCII 以外を使うんじゃねーよ
960デフォルトの名無しさん:2009/12/05(土) 21:35:37
大部分はCP932で保持されてるけど、不可能な部分だけUTF16なんだろ。
961デフォルトの名無しさん:2009/12/05(土) 21:36:07
>>957
それはシステム標準のロケールをどこにするかって話じゃね?
それによってunicode未対応のプログラムの挙動が変わるだけでファイル名はunicodeでは
962デフォルトの名無しさん:2009/12/05(土) 21:36:21
>>959
時代遅れ乙
963デフォルトの名無しさん:2009/12/05(土) 21:36:59
unicodeとCP932混在している場合に、char型関数だけ使って不具合が出なければ
charだけを使うことが出来る。
964デフォルトの名無しさん:2009/12/05(土) 21:37:08
>>959
米国人乙
965デフォルトの名無しさん:2009/12/05(土) 21:38:33
実際に、CP932、UTF16の文字コードが確定しているファイルを
FTPにでも上げて貰えるとわかりやすいのだが。
966955:2009/12/05(土) 21:39:27
>>960
そんなややこしいことはしないんじゃね?
967デフォルトの名無しさん:2009/12/05(土) 21:40:47
winapiでは自動で変換している可能性あるからな。どうすれば確定したファイル名ができるんだ。
968デフォルトの名無しさん:2009/12/05(土) 21:42:53
ググッてみたが
FAT32:sjis
NTFS:Unicode
だって

ただunicodeに対応してないプログラムで
ファイル名を取得してファイル名を変えるとかすると
強制的にsjisになっちゃうってさ
だけどファイル名操作でunicodeに対応したwin32apiってあるっけ?
969デフォルトの名無しさん:2009/12/05(土) 21:45:11
>>968
> 強制的にsjisになっちゃうってさ

SJISの範囲の文字しか使えないってことで、ファイル名にSJISが使われるってことじゃないだろ。
970968:2009/12/05(土) 21:46:28
>>969
あぁごめんその通りです、日本語が意味不明でした
てかここの住人相手に言及する内容じゃなかったな
971デフォルトの名無しさん:2009/12/05(土) 21:46:34
>>957 >>960

この説でだたしいって事だろ
972デフォルトの名無しさん:2009/12/05(土) 21:47:49
いや違うだろ
973デフォルトの名無しさん:2009/12/05(土) 21:47:56
> だけどファイル名操作でunicodeに対応したwin32apiってあるっけ?

W付のapiってそうじゃないの?
A付のAPIも内部でワイド文字に変換されるって話だし。

974デフォルトの名無しさん:2009/12/05(土) 21:51:10
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
975デフォルトの名無しさん:2009/12/05(土) 21:52:57
A 付きの API は W 付きのラッパなんだろうね。
976デフォルトの名無しさん:2009/12/05(土) 21:54:14
ということは、char型関数だけでは、全ファイルへのアクセスは不可能って事だな。
これはマルチプラットフォームのソースコードを書く上で困ったことになるな。
fopenなどファイル操作をする部分は、そのまま使えず linix windowsごとにラッパーするしかないな。
977デフォルトの名無しさん:2009/12/05(土) 21:59:17
windows linuxで動作されるにはどうすればいい。
linuxに合わせるにはラッパーは、UTF8を出力するようにしないと駄目か。
wchar_t型は、linuxの標準関数にないからな。
char utf8で入出力すると、fopenなども独自に書き換えないといけなくなり大作業になるな。
978デフォルトの名無しさん:2009/12/05(土) 22:00:03
%4F みたいな表記使えばいけるんじゃね?
979デフォルトの名無しさん:2009/12/05(土) 22:00:42
wchar_tを標準にして、linuxの方だけアクセスするときに、EUC UTF8に変換するのが楽か。
980デフォルトの名無しさん:2009/12/05(土) 22:00:49
>>968
FAT(16/32両方)も、事実上Unicode。
たしかに、8.3の短いファイル名はCP932などのマルチバイトだけど、
LFN(長いファイル名)はUTF-16LEで扱っている。
http://technet.microsoft.com/en-us/library/cc938438.aspx
981デフォルトの名無しさん:2009/12/05(土) 22:02:40
俺詳しくないけどlinuxのC標準入出力関数はwchar_t対応してるんじゃね?
対応してないのはgetoptだとかgetenvとかのC標準じゃなくて環境標準関数だけで
いまいち話分からずに横レスですまんが
982デフォルトの名無しさん:2009/12/05(土) 22:04:35
内部コードはDBに合わせたコードで。
入出力で必要があれば変換。
983デフォルトの名無しさん:2009/12/05(土) 22:07:36
>>981
wprintfとかfgetwsとかはあるけど、残念ながらfopenのwchar_t版はないの。POSIXにも標準Cにも。
984デフォルトの名無しさん:2009/12/05(土) 22:09:22
windowsのwchar_t関数の類似品を作るのが一番手間が掛からないな。
985デフォルトの名無しさん:2009/12/05(土) 22:16:41
getenvはc標準でmsvc限定なら_wgetenvがある
たしかgetoptはc標準じゃ無いよな、しかるに_wgetoptも無いと思われ

>>983
msvcには_wfopenってのがあるよ
うちのgccにもあるが、標準じゃないならディストリに依存するかな?
一応クロスプラットフォームで動作できると考えていいと思うが
986デフォルトの名無しさん:2009/12/05(土) 22:22:59
>>985
_getevnも_wfopenもVCというかWindowsくらいにしかないから、今話題にしているんでしょ。
987デフォルトの名無しさん:2009/12/05(土) 22:25:21
全ディレクトリ探ったが、wfopen無かったぞ。
mingwではないのかよ。
988デフォルトの名無しさん:2009/12/05(土) 22:28:09
wchar_tを標準にするのは、決定として、これをfopenにわたすときはどうすればいいの?
EUCかUTF8に変換しないといけないけど。
もともとのコードと、linixの内部コードの両方が判明して、それをコンバートする必要あるけど。
989デフォルトの名無しさん:2009/12/05(土) 22:29:19
あぁすまん、うちの環境が不思議環境だっただけだ、ほんと申し訳ない
990デフォルトの名無しさん:2009/12/05(土) 22:34:39
>>988
>>984
これが一番スマートじゃないかな
991デフォルトの名無しさん:2009/12/05(土) 22:36:10
その内部の変換はどうすればいいのかわからないですが?
992デフォルトの名無しさん:2009/12/05(土) 22:42:22
>>991
LANGでも取ってきてnkfしたら?
993デフォルトの名無しさん:2009/12/05(土) 22:45:59
次スレたててくる。
994デフォルトの名無しさん:2009/12/05(土) 22:49:42
立てた。

C言語なら俺に聞け(入門編)Part 57
http://pc12.2ch.net/test/read.cgi/tech/1260020924/
995デフォルトの名無しさん:2009/12/05(土) 22:50:02
   ✿
 ✿梅✿
.  ✿✿
996デフォルトの名無しさん:2009/12/05(土) 22:51:31
wopendirがwindowsにもlinuxにもない・・・
mingwとbccにはなぜか入ってる。
linuxにないのが絶望的にまずい。
charで取ってきて、コンパイラ毎に対応するwchar_tにかえていくしかないか。
997デフォルトの名無しさん:2009/12/05(土) 22:52:59
マルチプラットフォームは諦めて、linuxはchar windowsはwchar_tでアクセスするのが良いか。
998デフォルトの名無しさん:2009/12/05(土) 22:54:16
誰かマルチプラットフォームを謳っているSDLのソースの
入出力がどうなってるか調べてレポートしてくれ
999デフォルトの名無しさん:2009/12/05(土) 22:56:03
勝手に自作関数用意すれば、いろいろ出来るけど既存の関数に合わせるのが良いんです。
一方は、全く変更無しで通るようにする。
1000デフォルトの名無しさん:2009/12/05(土) 22:59:15
あ、1000もらいますね。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。