1 :
デフォルトの名無しさん :
2010/10/10(日) 22:37:04 BE:227211438-S★(531555)
,、 _ ,ノ ,ヘ、、 /´ ノ `ヽ、 / / ヽ i′ ,/ ', { { } ', `、 ,! ___ヽ ` 丿__,, , ゝ `ヽ、 /´ く _ <-‐''´  ̄ ̄`,ゝ、、___,,, <´ ̄ ̄` ー-> ` ー''´Z_ノ ヽ、_ヾ ー ´ C H I N E S E R E S T A U R A N T __ __ __ __ __ __ __ `i | | i'l_i'l_i' i''´ __`ヽ-ッ _コ l____ i´__`ー-ッ _,,.、 ,! ,! .l l _,,,_ └'´__ ``´ レ┐ ┌─┐ ,!'´ ``´ /,r''´ / 丿 '、'、 l´ __`ヽ-ッi''´__`ヽ-ッ .l l ノ / / / / / ヽ ヾ´ ``'´└'´,,_``'´ l └ ' ,/ ___,,ノ / _,,.r'' / \ `> r'"´ ``ヽS.) l 「´ 「´ _ノ ‘''' ´ `′ └ ''´ ̄``‐-‐'' └ ┘ └‐ '' ´
3 :
デフォルトの名無しさん :2010/10/10(日) 22:43:48
刀、 , ヘ
/´ ̄`ヽ /: : : \_____/: : : : ヽ、
,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
/: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
/: :.,.-ァ: : : |: : : : : : : : : :\: : : : :: : : :ヽ \ /: : : :/
 ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i / /: : : : :/
/: : ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/ /: : : : :/ 、
. /: : / . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : | /: : : : :/ |\
/: : ィ: : : : :.i: : | \!___/ ヽ:: : : : : : :\|:.:.:.:/:! ,': : : : / |: : \
/ / !: : : : :.ト‐|- ヽ \: : : : : l::::__:' :/ i: : : : :{ |: : : :.ヽ
l/ |: : :!: : .l: :| \: : : l´r. Y {: : : : :丶_______.ノ: : : : : :}
l: : :l: : :ト、| 、___,ィ ヽ: :| ゝ ノ '.: : : : : : : : : : : : : : : : : : : : : : /
|: : :ト、: |: :ヽ ___,彡 ´ ̄´ ヽl-‐' \: : : : : : : : : : : : : : : : : : イ
!: :从ヽ!ヽ.ハ=≠' , ///// ///u /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
V ヽ| }/// r‐'⌒ヽ イ〉、
ヽ、______ー‐‐' ィ´ /:/:7rt‐---、 こ、これは
>>1 乙じゃなくて
ィ幵ノ ./:/:./:.! !: : : : :!`ヽ ポニーテールなんだから
r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\ 変な勘違いしないでよね!
/: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\
4 :
デフォルトの名無しさん :2010/10/10(日) 22:46:40
___,. イ´ イ  ̄厂 _ __,.不 ニ-'⌒ `ヽ /´  ̄ ̄ ̄ ̄`ー 、 / /´ ,-‐' Y´ ヽ / ヽ / ', / i ,' / | ! イ | | ! │ ! ! ヽ │ | | │ │ ! ! │ ,.- 、 │ | ! │ ,... ! r‐、` │ │ | │ /r-、ヽ ゞ‐' j │ ! | ', │ !::ゞィ〃 ゛=" │ | ! │ `ー' │ ! | │ │ ! ! │, │ i | │ ,' ', | │ │ |
てst
Win32の構造体宣言でよく見る HOGESTRUCT hs = {sizeof hs}; って規格的には大丈夫なんでしょうか? リテラルパース時にはhsが解決されてるのか、仕様書みてもよくわかりませんでした。
sizeofは演算子でC89準拠であっても定数扱いだから初期化子に入れても問題ないし というか何が不安なんだ?
演算子じゃなくて、シンボルの話してるんですが。 char *p = (char *)&p; でもいいんですが、宣言の初期化で宣言元(?)をリテラルに含めていいのか、って話です。 例えばbcc32では下記はエラーになります。gccやtccではOKです。 char *p[] = { (char *)&p }; 動作がどーのこーのではなく、規格ではどう定義されてるのか調べてます。
すいません、そもそもbcc32は配列のリテラルの処理がおかしいってことが分かりました。 他のコンパイラではOKなので、とりあえず宣言の初期化子に代入先のオブジェクトを含めてよい、 ってことにしておきます。仕様上はよくわかりません。 ちなみに仕様はISO/IEC 9899 の6.7.8を参照していました。 /* オマケ:bcc32のおかしな挙動 */ char g; int main(void) { char q; char *p1[] = {&g}; /* OK */ char *p2[] = {&q}; /* ERROR:E2063 */ return 0; }
>>9 gのアドレスはリンク時に解決するから定数扱い。
qのアドレスはローカルだから可変値扱い。
bccはc99に対応していないから可変値で初期化できない。
gccやicc、Sun-OSのccはc99をある程度解釈する。
何の問題もない。
なるほど、C99ではOKでそれ以前では仕様上NG、ということですね。 VC6.0でエラーにならないなと思ったら/W4で規格外だというエラーがでました。 解決しました、ありがとうございます。
12 :
デフォルトの名無しさん :2010/10/11(月) 12:18:16
宣言で使っていいかどうかって問題じゃないだろ
↓定数でないものが使える宣言と使えない宣言がある
main()
{
int a = printf(0); /* OK */
int b[] = { printf(0) }; /* NG */
}
>>6 や
>>8 の論点は sizeof hs の時点で hs が何のことになっているのか、
&p の時点で p が何のことになっているのかであって、
sizeof や & の結果が定数かどうかではない
C言語で動的なn次元確保は可能ですか? ループにしたがって n+1,n+2,n+3,n+4,n+l次元みたいな
>>13 別に確保はできるよ。
ただし、Cである以上は、確保した領域をどう使うかはプログラマの責任だが
>>12 それです、本当に知りたかったことはそれなんですが、
どう見ても仕様書には書いてないように思います。
sizeofに戻ると、初期化リテラルのブロック内で自身の最終情報を得るのは不可能です。
変数が配列でないなどの条件付です。以下を考えてみれば分かります。
int a[] = { sizof a, sizeof a };
これはワンパス的なやりかたで実装されてると解決できません(宣言と初期化を完全に分けれません)。
VC6はゼロ初期化で押し通します。
現実のコンパイラでこの辺の挙動は「未定義」といっていい感じなのは分かりました。
だけど配列でない場合は上手くいく、その歯がゆさ。
そりゃそうだ。中身が判らないのに量が判るわけないじゃん。 構造体の場合は中身はこれこれって定義があるんだから量が判って当然だし。
>>16 決め付けはよくないですよ。
例えばtccでは正しく初期化されます。
「tccでは」 アホか
仕様書で記述発見しました。自己解決です。 お騒がせしました。
20 :
デフォルトの名無しさん :2010/10/11(月) 20:05:01
初歩的な質問ですみませんが printfで"●"をX回表示させるにはどうすればいいですかね?
printf("●"); をX個書く
22 :
デフォルトの名無しさん :2010/10/11(月) 20:09:36
25 :
デフォルトの名無しさん :2010/10/11(月) 23:29:05
そんなそんな
自演注意報。
for (i = 0; i < X; i++) printf("●");
30 :
デフォルトの名無しさん :2010/10/12(火) 17:13:44
int main(){ int a; int *p_a; a= 100; ←ここで定義するとエラーとなりました。 p_a = &a; return 0; } どうしてなんでしょう?
全角の空白が入ってるからじゃないか
32 :
デフォルトの名無しさん :2010/10/12(火) 17:22:24
すいません。 半角に直してもダメみたいです。
エラーの内容くらい書けよ
34 :
デフォルトの名無しさん :2010/10/12(火) 17:43:08
ポインタp_aが ここでは宣言できないと言われました。 a=100;を削除したところ通りました。 どうしてでしょうか?
>>34 codepadに問題のソースを貼り付けたまえ。
>>30 の通りではなく
int a;
a = 100;
int *p_a;
ってなってるんだろ
エラーメッセージをコピペすることさえできないクズ
>>34 適当な翻訳しなくていいからエラーコード全部出せって
エラーメッセージをそのままコピペしろや
配列を引数にすると参照渡し、構造体を引数にするとコピー渡しですよね。 構造体を引数にして構造体内の配列をコピー渡ししたいのですが 構造体定義でint a[9]と長さが指定されているものならコピーされましたが 構造体定義でint *aとし、使うときにmallocした配列だとコピーされないように感じます。 可変長配列の場合はできないのでしょうか?
長さが分からないからな
コピーされるのはポインタ変数だからな
43 :
40 :2010/10/12(火) 18:07:43
あー。構造体のメンバとしてはint *aだから*aがコピーされるだけ。 aを配列として扱ってるのはおまえの勝手だろ ってことですか。 では関数の引数に可変長の配列をコピーで渡したい場合はどうしたらいいのでしょうか?
コピー渡しとか変な用語作るなよw
自分で新しくmallocしてコピーして渡したあとfreeすればいいです
関数側でサイズを受け取って、内部でmallocで領域確保してそこにコピーしてやるしかないんじゃね?
c++と勘違いしてるとか
出力変換指定子についての質問です。 printf("%d万",100);の場合、%dに右側の100という文字列を 代入するという考え方で合ってるでしょうか?
代入じゃないけど100を参照しにいく
>>50 そんなこと知らなくてもCを使うのに困ることはないよ。
その上でどうしても知りたいなら、使ってるコンパイラのソースを入手しなさい。
規格で決まってるのは「どういう結果になるか」だけ。
「どう実現するか」はコンパイラ次第。
%dと100が置き換わると考えれば分かりやすいんじゃ
cygwin上のgccから以下のプログラムをコンパイルし、C:\にディレクトリ"a"とコンパイルしたプログラムを置いて実行したのですが、失敗してしまいました。 "R:\a"の部分を"b"とすると正常に処理されました。解決策はありますか? #include <stdio.h> int main(void) { char *oldname = "a"; char *newname = "R:\a"; if( rename( oldname, newname ) == 0 ){ printf( "Rename successflly from %s to %s", oldname, newname ); } else{ printf( "Rename failed" ); } return 0; }
R:\\a
>>55 ありがとうございました。
リネーム先が"R:\\a"ではまだエラーが出てしまうのですが、試しに"C:\\b"とするとリネームしてくれるので構文に間違いないと思います。
色々粘ってみます。
>>56 R:\で実行してないか?
R:\aをR:\aにリネームはできないよ。
C:\a を R:\a にもリネームできないと思う そういうのはリネームじゃなくて移動っていうんだ
>>57 ありがとうございます。
C:\に実行ファイルとディレクトリ"a"を置いてやってます。R:\はramdiskです。
Windows(CRT)でもPOSIXでも
>>58 が正解だな
>>58 >>60 ありゃりゃ、方法からマズかったですか。
調べなおして書き直すことにします。ありがとうございました。
62 :
57 :2010/10/12(火) 21:17:12
>54 pathの指定方法が間違っていないかい? ドライブルートは/cygdriveの下にマウントされる。 char *newname = "R:\a"; ではなくて char *newname = "/cygdrive/r/a"; だと思うよ。 試しにls /cygdriveに何がマウントされているか、確かめてみて。
64 :
54 :2010/10/13(水) 00:04:49
windowsAPIのCopyFileとやらで対処しようとしたら案の定というかBCCに拒否され吠え面かいて戻ってきたら返信が。ありがとうございます。
>>62 いえいえ、
>>54 みたいな稚拙でイミフな質問を適切に解釈してくださるエスパーの方々には頭が上がりません
>>63 早速以下のように改造のうえコンパイルしてC:\で走らせてみました。
#include <stdio.h>
int main(void)
{
char *oldname = "a";
char *newname = "/cygdrive/r/a";
if( rename( oldname, newname ) == 0 ){
printf( "Rename successfly from %s to %s", oldname, newname );
}
else{
printf( "Rename failed : %s",newname );
}
return 0;
}
するとDOSプロンプト上で次のように結果が得られました。
Rename failed : /cygdrive/r/a
この時プログラムはWindowsディスク上に/cygdrive/r/aを作ろうとしてるんでしょうか?
ちなみにnewnameを"R:\\a"とすると次のようになりました。
Rename failed : r:\a
失敗したときのerrnoを確認してみたら
66 :
63 :2010/10/13(水) 01:01:06
>64 >するとDOSプロンプト上で次のように結果が得られました。 cygwin bash shell上で実行しないとだめだよ。 このコードで期待通りに動いているよ。 #include <stdio.h> int main(void) { char *oldname = "input.txt"; char *newname = "/cygdrive/c/hoge.txt"; if( rename( oldname, newname ) == 0 ){ printf( "Rename successflly from %s to %s\n", oldname, newname ); } else { printf( "Rename failed\n" ); } return 0; } 実行結果 $ ./main Rename successflly from input.txt to /cygdrive/c/hoge.txt
>>63 cygwinはどっちも受け付ける
>>64 R:\もC:\もWindowsの中だろ
だからさあファイルシステムを跨いだrename()は無理だっつーの
>>65 errnoなんてライブラリがあるんですね。勉強になります。
>>66 cygwinのbash上でそのプログラムを実行してみたのですが、同じ結果でした。errnoは2でnot foundみたいでした。私の環境か方法が悪いのだと思います。
その前に元プログラムの*newname = "r:\\a"で試してみたらerrno=13 (permission denied)が出力されました。
というかそのプログラムさえ動かないのは何かマズいミスを犯してる気がするので、明日落ち着いてまた走らせてみます。
>>67 やや、やっぱり私の試してる通りの方法は無理ですか。なんとかAPIを利用しないやり方をと思ったのですが・・・
WindowsAPIの部分をコンパイルするには該当するヘッダファイルを導入すればいいのかな?
色々実験しながらのレスとはいえ、アドバイスを下さる方々に不躾な部分があったかもしれません。お詫び申し上げます。
重ね重ねありがとうございます。
cygwinのstrace使ってみるとか
cygwinなんて使うのやめたらいいのに。
糞アッー!スワップは使えないことは無い
>>67 コロンつきのパスを解釈するのはシェルがコマンドラインをパースするときだろ。
アプリ内からライブラリ呼ぶときまでは受け付けてくれないんじゃないかと思うが。
つーか、cygwinスレに行けばいいよ。
int main(void)
{
char res67[256];
printf("
>>72 つーか、cygwinスレに行けばいいよ。\n");
gets(res67);
if (res67 =="
>>67 :cygwinスレ行かない\n")
{
printf("俺:
>>72 \n釣りだろ\n");
}
}
gets()使用禁止
gets は便利だから学習段階においては積極的に利用すべし。
76 :
デフォルトの名無しさん :2010/10/13(水) 17:23:01
gets()の罠には一度はまっておけばいいと思うよ。
78 :
デフォルトの名無しさん :2010/10/13(水) 17:32:41
そうそう「転ばぬ先の杖」は初学者の為にならない 一度痛い目を見ておくべき
てか、標準入力なんて学習段階でしか使わないんじゃね?
そうでもない。リダイレクトして使うことがしばしば。
生きがいもなく生きてるくせに妙なこだわりだけはあるんだなお前ら
煽りだけが生きがいの人に言われてもw
getsだろうがscanfだろうがどうでもいい
C自体が時代遅れの古き良き時代の言語なのに痛い目もなにもないよーな
85 :
デフォルトの名無しさん :2010/10/13(水) 18:34:25
staticのローカル変数をchar10コ分確保する場合どっちの記述が正しいですか? どれも正しくない場合は訂正してください。 1. static char *str = (char *)malloc( sizeof(char) * 10 ); 2. static char *str = (static char *)malloc( sizeof(char) * 10 );
3. static char str[10];
87 :
デフォルトの名無しさん :2010/10/13(水) 18:38:02
>>86 ごめん。個数は変数で与えられいて動的に確保しなければならない場合は?
static char *str; if (!str) str = malloc(個数);
90 :
デフォルトの名無しさん :2010/10/13(水) 18:42:58
>>84 WindowsもLinuxもCで書かれているのに古き良きもないもんだ
91 :
デフォルトの名無しさん :2010/10/13(水) 18:44:00
ifはどういう意味ですか? 初期化してないのに参照できるんですか?
そもそも静的変数に不定数の初期化子を代入できない C++と勘違いしてね?
93 :
デフォルトの名無しさん :2010/10/13(水) 18:49:09
94 :
デフォルトの名無しさん :2010/10/13(水) 18:50:29
>>93 バーカCだよ
MSDN良く見てみろ
俺も最初はC++だと勘違いしていた口だ
どっちでもいい
96 :
デフォルトの名無しさん :2010/10/13(水) 18:53:27
>>92 そうですか。
ようは何がしたいかというと呼び出した関数内で静的領域(配列)を動的に確保して
それに値代入して、そのアドレスを返したいんですけど、
こういう場合はどうやって領域確保すりゃいいんですか?
98 :
デフォルトの名無しさん :2010/10/13(水) 18:55:33
100 :
デフォルトの名無しさん :2010/10/13(水) 18:57:51
>>96 どうして静的領域じゃないとだめなん?
ヒープ領域ではだめな理由があるの?
>>98 エンジンに翼を付けて飛ばしたいのか?
翼にエンジンを付けて飛ばしたいのか?
102 :
デフォルトの名無しさん :2010/10/13(水) 19:01:03
>>100 ローカル変数として宣言したものを返したいからです。
>静的領域(配列)を動的に確保して おかしくね
発想を変えた方が良い
105 :
デフォルトの名無しさん :2010/10/13(水) 19:04:01
>>102 本当のローカル変数は関数を出たら消えてしまうものだよ
staticなローカル変数は特別だと思え
醤油をソースの代わりに使うようなもん
107 :
デフォルトの名無しさん :2010/10/13(水) 19:04:54
静的なものを動的に確保し静的なものに動的に代入する
109 :
デフォルトの名無しさん :2010/10/13(水) 19:08:43
>>105 そうですよね。
だから消えてしまわないようにして、
ポインタ引き渡しして呼び出した側で使いたいわけです。
Cを使う必要があるのか、をまず考える必要があるだろ。 ケーキを切るときはハサミではなくケーキナイフを使う。 紙を切るときは包丁ではなくハサミやカッターを使う。
サンダルで登山するようなもん
112 :
デフォルトの名無しさん :2010/10/13(水) 19:11:41
>>109 ヒープ領域で確保したってポインタさえ失わなければ、そしてfree()さえしなければ
消えないじゃん?
ヘルメットかぶって飛行機に乗るようなもん
動的に確保したものを戻り値にすればいいのでは
foo(int *a) { *a = 1; } int a; foo(&a); をポインタ変数に拡張するのと違うの? hoge(int** a) { *a = malloc()... /* 動的確保 */ } int *a; hoge(&a);
タバコをいちいち消火器で消すようなもん
巨大な配列をグローバルで宣言しとけばいいのです
ポインタによる動的なメモリ確保は水面下での破壊をもたらす。
119 :
デフォルトの名無しさん :2010/10/13(水) 19:18:34
>>110 だいぶ書き進めてるんで無理です。
グローバル変数しかないですか?
もし、一文字返すだけなら
void funk(char *moji){
static char a;
a='A';
moji=&a;
return;
}
でいいと思うんですけど、
今やろうとしてるのは構造体の配列をかえすものです。
だだし、その長さが関数内で決まります。
ユーザーが故意に引数char *mojiに4Gバイトくらいの文字列を与えたらどうなるんだろう。
構造体の長さが変えられると?
連結リストじゃなくて?
123 :
デフォルトの名無しさん :2010/10/13(水) 19:23:22
>>118 さっきからうるさいな
ポインタでひどい目に遭ったからと言って八つ当たりするな
struct foo { int num; struct hoge { } elem[]; }; この末尾が大きさ不定配列の構造体って C89 はセーフだっけ?
125 :
デフォルトの名無しさん :2010/10/13(水) 19:26:16
>>124 ダメ
elem[1]; とか最低でも1の長さが必要
何故staticに拘るのか? 皆言ってるようにmallocでヒープ確保すりゃいい話。
struct hoge { } *elem;
128 :
デフォルトの名無しさん :2010/10/13(水) 19:26:58
129 :
デフォルトの名無しさん :2010/10/13(水) 19:28:04
130 :
デフォルトの名無しさん :2010/10/13(水) 19:29:58
>>128 そんなに構造体配列の長さを可変したいならCをやめてC++のstd::vectorを使えばいいだろ
Cでもrealloc()が使えるけどな
構造体配列の長さってなに?
132 :
デフォルトの名無しさん :2010/10/13(水) 19:31:58
struct {} hoge[これ]; じゃないの?
やりたいことをソースにしたら、コンパイラに怒られるだけのような
135 :
デフォルトの名無しさん :2010/10/13(水) 19:36:23
>>130 呼び出し側で構造体ひとつ宣言して、そのポインタを引数として与えて、
呼び出された関数内でrealloc()を使って構造体配列の長さを変更すればいいということですね?
それで行ってみようかと思います。
136 :
124 :2010/10/13(水) 19:37:06
>>125 thx
Win32 の BITMAPHEADER だったかがこんな構造だったな
と記憶してたが、正確に把握してなかった
struct foo *p = (struct foo *)malloc(sizeof(struct foo) + sizoof(struct hoge) * num);
p->num = num;
p->elem[0] 〜 p->elem[num-1] までは使えるってやつ
137 :
デフォルトの名無しさん :2010/10/13(水) 19:37:20
mallocで確保したメモリーじゃないとreallocできないよ。
138 :
デフォルトの名無しさん :2010/10/13(水) 19:38:52
>>133 構造体の連結リストではなく構造体の配列です
昔はトリッキーな書き方してるの見たことあるけど 最近は、見なくなったな
140 :
デフォルトの名無しさん :2010/10/13(水) 19:40:22
>>137 へー そうなんですか。
ありがとうございます。
141 :
デフォルトの名無しさん :2010/10/13(水) 19:40:44
>>138 あーバカバカバカ
基礎からやり直せ
今そんな状態でプログラムを進めると修復不能なバグを作り出すぞ絶対
142 :
デフォルトの名無しさん :2010/10/13(水) 19:42:31
外から渡してもらってreallocしなくても、関数の中でmallocしてポインタ返せばいいんじゃないの。
143 :
デフォルトの名無しさん :2010/10/13(水) 19:46:02
>>142 いやこいつは多分malloc()を全く理解していない
今度はメモリリークを起こすぞ
144 :
デフォルトの名無しさん :2010/10/13(水) 19:50:24
>>142 関数のブロック内でローカル変数に対してmallocした場合
関数のブロックが閉じた時点で領域が解放されてしまうのでダメじゃないですか?
>>144 いいえ
明示的にそのポインタを free() しない限り領域は生き残ります
まさか gcc のソースだかで使ってる alloca と勘違いしてるのか?
147 :
デフォルトの名無しさん :2010/10/13(水) 19:54:43
>>144 「ポインタを関数の返却値として返す」とはどういう事か理解した方がいい
148 :
デフォルトの名無しさん :2010/10/13(水) 19:56:01
>>145 malloc()で確保した領域は、普通のローカル変数と扱いが違うわけですか?
149 :
デフォルトの名無しさん :2010/10/13(水) 19:56:15
こういう奴は素直にC++に移行してstd::vectorを使った方が無駄な時間を潰さずに済むのにな
150 :
デフォルトの名無しさん :2010/10/13(水) 19:58:20
>>148 違う
つか、変数や領域とポインタが gdgd になってるな…
>>149 そう思う反面スマポで引っかかりそうな気もしないでもないw
152 :
デフォルトの名無しさん :2010/10/13(水) 20:02:53
>>151 スマポはstd::auto_ptrは使用禁止にしてstd::tr1::shared_ptrかstd::tr1::shared_ptrのみ
使用可にするとか制限付けないとなw
多分COAPに引っ掛かってまた悩むw
153 :
デフォルトの名無しさん :2010/10/13(水) 20:04:12
×std::tr1::shared_ptrのみ ○std::tr1::unique_ptrのみ 俺も最初はstd::auto_ptrを入れてsortしたら中身がぶっ壊れて悩んだ 今じゃ代入そのものが不可になってるのが多いけどな
あ、ごめん 俺がageてたのか
155 :
デフォルトの名無しさん :2010/10/13(水) 20:09:43
>>148 mallocで確保した領域は、ヒープ内にある。
ローカル変数は、スタック上にある。
スタック上の領域は関数を抜けると無効になる。
関数を抜けても使いたい領域はスタック上に確保する。
だからmallocを使う。
スタックとかヒープ領域とか言って通用するかな・・・・
157 :
デフォルトの名無しさん :2010/10/13(水) 20:15:24
>>155 >関数を抜けても使いたい領域はスタック上に確保する。
ヒープ上じゃないんですか
とにかく、参考になりました。
158 :
デフォルトの名無しさん :2010/10/13(水) 20:16:49
159 :
155 :2010/10/13(水) 20:18:06
>>157 ヒープだった。ごめんなさい。
× >関数を抜けても使いたい領域はスタック上に確保する。
○ >関数を抜けても使いたい領域はヒープ上に確保する。
>>40 >配列を引数にすると参照渡し、構造体を引数にするとコピー渡しですよね。
Cに参照渡しはないよ。K&Rにもはっきり書いてある。
161 :
158 :2010/10/13(水) 20:24:11
そろそろ抜けます。 いままで回答してくださった皆さんありがとう
番号コテ使うなら、一連の同じ話題の間は同じのにしてくれ コテの意味がない
しかしお前ら関心するわ 俺は人に教える事はようできん 途中でムカッときてしまう
>>163 同じ人間は2人といない。キミと同じ知識、経験を持った人間はいない。
言ってる意味がわかるな?
>>164 大学の時に教育原理を取って、中学校の数学の免状は持ってるけど
それとは別の問題みたいですね
まったく別の問題だね
>>168 アホかうるそれるすぼるんよすにんいっちゃだ
うる って打ったらGoogleIMEで候補に出てきてワロタ
長い間座ってるとお尻が痛くなるんですがどうすればいいんでしょうか?
173 :
デフォルトの名無しさん :2010/10/14(木) 07:40:40
>>173 TwitterネタはTwitterでやれ。
ふほっ
177 :
デフォルトの名無しさん :2010/10/14(木) 16:17:53
日の丸の国旗の絵を表示させるプログラムをおしえてください。
printf("+----+\n"); printf("| ● |\n"); printf("+----+\n");
それ、バングラディシュじゃん。
バングラデシュね
181 :
デフォルトの名無しさん :2010/10/14(木) 16:47:36
#include <stdio.h> #include <math.h> #define PGM_ID "P6" #define W 400 #define H 300 int main(){ int x, y; unsigned char pixel; printf("%s\n", PGM_ID); printf("%d %d\n",W,H); printf("%d\n", 255 ); for(y=150; y>-150; y--){ for( x=-200; x<200; x++){ if(y<0.75*x+150 && y<-0.75*x+150 && y>-0.75*x-150 && y>0.75*x-150){ putchar(100); putchar(192); putchar(67); } else{ putchar(255); putchar(255); putchar(255); }}} return 0; }
183 :
デフォルトの名無しさん :2010/10/15(金) 00:20:15
い
184 :
デフォルトの名無しさん :2010/10/15(金) 00:30:58
/* * typ2.c - 標準入力の代わりに、起動時の * コマンドラインの第一パラメータのファイルを処理 */ #include <stdio.h> main(int argc, char *argv[]) { FILE *fp; int c; if (argc != 2){ /* コマンド名も含んだ個数 */ printf("parameter error\n"); exit(1); } if ((fp = fopen(argv{1], "r"))==NULL) { printf("can't open %s\n", argv[1]); exit(1); } while ((c = fgetc(fp)) != EOF) fputc(c, stdout); fclose(fp); exit(0); } 教えてください 上のプログラムはコマンドラインで指定したファイルを入力として画面に表示する ものなんですけど 参考書通りにコンパイルしてもエラーが出てしまいます。 どこを直せばいいですか 参考書まんまのはずなんですが 構文エラーがでます
fopen(argv{1], "r") fopen(argv[1], "r")
学習段階の使い捨てプログラムでいちいちエラーチェックなんかしなくていいよ。 argc とか fopen の返りが NULL とか。
じゃないや、括弧の記号が間違ってるのか
#include <stdio.h> int main(void) { char c = 'A'; char *p; p= &c; printf("%c\n",*p); *p=*p+2; printf("%c\n",*p); return 0; } 実行すると A C って出ますけど 「C」なんて一切出てきてないのに、なぜ A C って表示されるんですか? まさかchar c = 'A' って宣言すると、 「その+2のアドレスにCもあるよ」って宣言してるのと同じ意味なんでしょうか? ここまで読み返すと意味不ですが、回答お願いします
char c = 'A'; これはc=0x41と同じ *p=*p+2; これは c=c+2;と同じ。よってc=0x43と同じ これはc='C';と同じ
'A' + 2 == 'C'
*(p+2) ← 「その+2のアドレスに書いてる値 *p + 2 ← 「そのアドレスに書いてる値に +2 した値
asciiコードがわからんのか、ポインタがわからんのか、どっちだ?
>「その+2のアドレスにCもあるよ」 ポインタがわかってないみたいだな
+2 のアドレスを指すなら書き方は p + 2 *p と書くと、p の指すアドレスに保存されてるデータ。 たとえば char c = 'A'; で、 変数 c の、メモリー中での場所が、たとえば 0x1234 なら、 char* p; p = &c; で,変数 p に記録される数字も 0x1234 になる。 0x1234 の場所に、実際に記録されてるデータは 'A' A は、数字に直すと65。 変数 c には(メモリ番地0x1234の場所には)65という数字が記録されている。 p と書くと 0x1234 という数字を参照することになるので、p+2 なら 0x1234 + 2 = 0x1236 となる。 これなら c の +2 先のアドレスと同じ数字。 一方、*p と書くと 変数c(メモリ番地0x1234の場所)に記録されている65という数字を参照することになるので、 *p+2 は 65 + 2 という意味なので、 67 という数字を指す。 printf の %c に 67 という数字を渡すと C と表示される。 (「67ならCと表示する」という決まりなので) 0x1234 + 2 の 0x1236 の場所に、自動的に C (数字の67)が記録されたりはしてないと思います。
197 :
デフォルトの名無しさん :2010/10/15(金) 19:33:47
C言語でオヌヌメのライブラリって何ですか?C++でいうMFCみたいのってないですか?
GTK+ Win32API
mylib.h
201 :
190 :2010/10/15(金) 19:48:08
あーASCIIコード+2ってことですか わかりましたーすいませんー
curses
>>196 その説明だとchar以外になったときに
0x1236にならないってハマりそう
char *a; int *b; a = 0; b = 4; printf("a: %d\n", a); printf("b: %d\n", b); printf("a+1: %d\n", a+1); printf("b+1: %d\n", b+1); printf("a+b: %d\n", a+b); これはどうしてなんですか?
205 :
デフォルトの名無しさん :2010/10/15(金) 20:05:12
コンパイラのオススメは何ですか
lsi-c試食版
ボーランド
>>205 Linux系ならgcc。WindowsならVisual Studioが基本だが
コマンドラインで使うなら、旧bcc(codegearのC++Compiler)も悪くはない
ICCとか一風変わったものに手を出すのは後回しでいい
そもそも char *a; int *b; a = 0; b = 4; はコンパイルエラーになりそうな気がするんだが気のせいか?
>>208 初心者には統合開発環境の付いた Turbo C++ 1.01 を薦めるべき。
いまどき IDE 無しでは初心者は受け入れられない。
>>213 >printf("a+b: %d\n", a+b);
いやこっちだろ
言語そのものの勉強と関係無いところでトラブルを起こしそうだから
MinGW使ったことない?っつーかそんな人気ないの? セットアップ超簡単なんだけどな。BCCよりもね。 出来上がるバイナリもすげー小さいし基本gccだからc99ほぼ対応だし。 いいことだらけ。
>>219 使っているが人に勧めるようなものではない
初心者には資料が多いものを勧めるべき
仮想マシンのlinux上でgcc
gccの資料なんて一番多いけどなw ソースも入手できるし
cygwinの方が楽でない? MinGWってgccでまともなWindowsアプリにしたいときか64bitにしたいときしか使わない。 今はどうか知らないけどcygwinからオプション一発でMinGWの32bitバイナリ作れたと思うし。
>>223 Cygwinはそれこそ使い始めるまでが大変じゃないか?
MSYSもCygwinのコマンドも覚えなきゃならんし、配布時にdllも必要だし。
MinGWはgccをそのままWinに移植しただけだからシンプルだよ。
プログラミングやるつもりならunixのコマンドやらvimのコマンドを覚えなきゃならへんねん
>>224 VC++ ExpressとSDK付属などのコンパイラ単品を比較してコンパイラ単品に軍配をあげるようなもの
>言語そのものの勉強と関係無いところでトラブルを起こしそうだから を考慮するならシンプルなほうがいいじゃない。
Windows SDKやら.NET Frameworkやら入れなきゃならないVSよりよっぽど簡単だけどな。 まあいいやこの辺でやめとくよ。
2010からWindowsSDKは標準になりますた
231 :
デフォルトの名無しさん :2010/10/15(金) 21:55:03
LiDIAという数論ライブラリがあって巨大整数が使えるのですが、 このライブラリを使っても環境依存しない独立したアプリは作れ るでしょうか。コンパイラはVSかMINGWのGCCを考えています。
>>231 何故それをそのライブラリの開発元に聞かないんだ。
233 :
デフォルトの名無しさん :2010/10/15(金) 22:01:44
開発元はドイツなので・・・
斜め読みするに、
Linuxとx86/SPARCの組み合わせしかテストされてないっぽいが
http://www.cdc.informatik.tu-darmstadt.de/TI/LiDIA/ それに含まれているらしいGMPであれば
何とかなりそうな雰囲気だが、よく知らない
>GMP's main target platforms are Unix-type systems, such as GNU/Linux, Solaris,
>HP-UX, Mac OS X/Darwin, BSD, AIX, etc. It also is known to work on Windows
>in both 32-bit and 64-bit mode.
http://gmplib.org/
235 :
デフォルトの名無しさん :2010/10/15(金) 22:04:35
ドキュメントが読めない状況で、どうやって使ってるの?
237 :
デフォルトの名無しさん :2010/10/15(金) 22:06:09
とりあえず実装して試してみます。
238 :
デフォルトの名無しさん :2010/10/15(金) 22:08:58
日本語の本で紹介されていたので使っています。
>>233 ドイツ人なら余程のことがない限り拙い英語でも充分遣り取りできると思うが。
240 :
デフォルトの名無しさん :2010/10/15(金) 22:14:15
英語ほとんどわかりません。 エラーメッセージもよくわかりません。 日本語のサンプルコードでプログラムしてます。
これはひどい
242 :
デフォルトの名無しさん :2010/10/15(金) 22:19:25
CygwinでCC=gcc-3 CXX=g++-3とやるとコンパイルできるのですが、 MINGWだとコンパイルに失敗します。 古いコンパイラでないと出来ないみたいです。
バカもの!いいから英語を嫁!聞くなら嫁!読んでから聞け!以上
もうC言語関係ねーじゃん
ひょっ
246 :
デフォルトの名無しさん :2010/10/16(土) 12:48:10
× if ((fp = fopen(argv{1], "r"))==NULL) { ○ if ((fp = fopen(argv[1], "r"))==NULL) {
0から3までの4つの整数をランダムに発生させるにはどうすればよいですか?
rand()%4
ありがとうございます
4つ程度なら問題なかろう
むしろ小さければ小さいほど顕著になる問題なのでは?
違う RAND_MAXに近づけは近づくほど精度が悪くなる よく考えれば分かるだろうに
それは別の問題だろ
4*3*2*1のパターンしか無いのな
じゃあどう書けば「いいの?
続け様に2回も貼られてるリンク先を読まない人って
いつまでRAND_MAXは0x7FFFなんですか? 精度が低すぎて使い物にならないんですが。
君が他のコンパイラを導入するまで
メルヘンツイッターか。
いつまでCHAR_BITは0x8なんですか? 精度が低すぎて使い物にならないんですが。
>>267 デジタルシグナルプロセッサ環境マヂおすすめ
CHAR_BIT==32とか有効ビット!=ビット数とか味わえるよ
DSP使ったことあるけど CHAR_BIT は 8 だけど、4byte境界以外のアクセスは例外発生 ってコンパイラだった
8bitの処理が必要になったときはどうするんだろうね?
271 :
デフォルトの名無しさん :2010/10/16(土) 17:21:49
>>248 俺には同じに見えるんですが何が違うのかおしえて
視力
>>270 イミディエイトアドレス に 境界外の値が使えない
ってだけなので、ビットシフトとマスクで 値操作そのものはなんとかなるよ
あとはインラインアセンブラで SSEのSIMD的なレジスタ分配コードを経由させる
>>271 上: argv 直後 { からす括弧
下: argv 直後 [ カギ括弧
276 :
デフォルトの名無しさん :2010/10/16(土) 17:28:16
>>271 です
正解のほうをコピーしてみたら警告はでましたがエラーなく実行できました
どこが間違ってたか教えて〜
277 :
デフォルトの名無しさん :2010/10/16(土) 17:29:12
↑ありがとうございます↑
↑どういたしまして↑
fgetsで取得した文字列(仮にlineとして)を char *tekitou = "nanchara-kanchara"みたいな他の文字列と結合したいんですけど 結合自体はstrcpyとかstrcatでいいとわかったんですが その時メモリを動的に設定するにはどうしたらいいんでしょうか良いサンプルコードが載ったサイトなど教えてください
↑さようなら↑
↑ありがとうございます↑
↑/→\↓/←\↑
283 :
デフォルトの名無しさん :2010/10/16(土) 17:44:48
C言語で巨大整数を扱うのに適したライブラリは何ですか? 例えばNTL、GMP、LiDIAなどでJAVAみたいにBigIntegerのような データ型が定義されて意識することなく塩山市などの計算が簡単に 出来るような処理系を探しています。
C言語プログラマという生き方ではそういうのは自作することになっている
逆に言えば、作ろうと思わない時点にCには向いてない。 もっとライブラリ豊富な言語に移行したほうがハッピーになれるよ。
286 :
デフォルトの名無しさん :2010/10/16(土) 18:00:52
じゃあなんでみんな数論ライブラリ作ってるの?
内部的に文字列で巨大整数を扱うような処理をカプセル化してライブラリ化すればいいだけじゃないの
290 :
デフォルトの名無しさん :2010/10/16(土) 18:14:11
昔GCC2.95の頃はC++でIntegerという型があってよくそれを使ってました。 でも8000ビットを超えると計算結果が正しくなくなるというバグが ありました。 その後に出てきたのがGMPでしたけど、使いにくいので使ってません。
291 :
デフォルトの名無しさん :2010/10/16(土) 18:45:53
Rubyで作ってきた関数の便利さを生かしながら、性能の高速化を求める にはJAVAに移植した方がいいのでしょうか。
java はそのうち使うだけで oracle に請求されるようになります。
293 :
デフォルトの名無しさん :2010/10/16(土) 18:59:57
windowsでsystem関数を使ってBATファイルを作りそれをスタートアップに登録させたいのですが スタートアップのフォルダパス取得方法わかりません、教えてくれませんか。
C:\Documents and Settings\<ユーザー名>\スタート メニュー\プログラム
>>293 SHGetSpecialFolderPath
いくら入門スレでもそこまで親切に教えるのはどうかと
ちゃんとお礼言っとけよ
ふっほっ
ちゃんとお札貼っとけよ
アリガタマキン ( ´∀`)ノ⌒ω)Д`)ブニュ
(`・ω・´)シャキーン
日本語とかの2バイト文字の1バイト目が128を超えることってありますか?
ふつーにおきる
VCならchar型は0〜255バイトまで表現できますけど、 VC以外のコンパイラで符号ありのchar型の場合は、 unsigned char型で読むべきなのでしょうか?
VC++もデフォはcharはsingedだが?
308 :
デフォルトの名無しさん :2010/10/16(土) 22:39:31
何をunsigned char型で読むべきかと質問しているのか?
文字列リテラル "abc" のデフォルトの型の話? < VCで unsigned char
VCってデフォってcharはunsignedじゃありませんでしたっけ? 主に2バイト文字を読むときはunsigned charで読むべきなのかと思いまして。。
何のために/Jが有ると思ってんの
何ですか。/Jって?
/.Jならわかるんだけど
314 :
デフォルトの名無しさん :2010/10/16(土) 23:23:19
わかるならべつにいいじゃん なにもったいぶっちゃってんの
ググれ無いバカには不要のものだよ
/Jつけたら、unsignedになるんですね。 本題に戻りたいんですが、 日本語などの2バイト文字を読むには、unsigned charで読むべきなのでしょうか ?
317 :
デフォルトの名無しさん :2010/10/16(土) 23:45:50
2バイトならwchar_tだろ
2バイト文字ならwcharだろ。 多バイト文字は2バイトとは限らんよ。 つーか、Windows の場合は2バイト文字とマルチバイト文字はちゃんと区別されてるから、 普通は両対応させるためにマクロの TCHAR を使う。 リテラル文字列も生の "" を使ったりはしない。 まあ、出来てないゆとりも多いけどな。
いえ、char型の時の話をしてるんですが。。。
>>316 ビットの並びが先にある。
その値を文字として解釈させるなら符号に意味は無い。
つまり好きにしろってこと。
だから2バイト文字つったら普通は UTF-16 とかだろ。 それを char で扱うのは良くない。
最上位ビットが立ってて、符号有りだったらマイナスの値になるけど、 別に文字として解釈されるから、関係ないってことでいいですか?
使い方による。 符号の扱いが違うんだから同じなわけがないだろ。
326 :
デフォルトの名無しさん :2010/10/17(日) 00:17:17
問題ない
英語以外ならUTF16がスタンダードだろ。 これが便利なのは間違いない。
え?
wchar関係が揃ってない環境が今だにあるもんで
符号はプログラムが四則演算、比較ょするときにきいてくる。 文字列操作では関係無い。
331 :
デフォルトの名無しさん :2010/10/17(日) 00:21:56
比較ょ
>>327 同意。
だが俺は Shift-JIS を使い続ける。
utf8のほうがいいだろ・・・
まあ、なんとなく分かったんでよしとします。 どもありがとうございました。
string型みたいなのがあったら、こんな疑問を持つ入門者も現れなかっただろうに。 何でcharacter型なのに符号付けちゃったのかね?
>>333 プッ
あんなデータ間延びする形式ありがたがっちゃってんの?w
337 :
デフォルトの名無しさん :2010/10/17(日) 00:44:38
文字を扱うには「char」 符号付きの小さい整数を扱うには「signed char」 符号なしの小さい整数を扱うには「unsigned char」
338 :
デフォルトの名無しさん :2010/10/17(日) 00:45:49
>>336 unicodeが16ビットで表現できると思ってるのか・・・
そこでUTF-32の出番ですね
そもそも unicode(笑) だろ。
343 :
デフォルトの名無しさん :2010/10/17(日) 00:58:10
charと同じサイズのストレージで整数を扱いたい奴もいるだろ
344 :
デフォルトの名無しさん :2010/10/17(日) 01:04:24
CJK統合漢字なんてアホなもの作らなければ、UTF-32が絶対神だったんだけどな。 まあ、いまさら、どうでもいいわ。 Unicodeが滅びるまでUTF-16でゴニョゴニョやればいいんじゃないの。
UTF-32が一番いいんだろうけど。容量がな。 UTF8 よりUTF16 。UTF16 よりUTF32だろうけど。 英語圏で使う限りは、UTF32を主流にして良い事がない。 するとUTF8になってしまうな。多勢派。
携帯も同じ事だな。 UTF8やUTF16より、容量食わないEUCやSJISを使う。
容量(笑)
EUCやSJISを使うのは、ガラパゴス技術者がガラパゴスミドルを使い続けるためだろ。 そういう連中が「容量」を言い訳にしてるのかもしれないが、容量は関係ない。 単なる既得権益者の妄言。
いまさらeuc,sjisは日本語だけって制限あるからきつい
美味い
何がきついんだよw 日本語と、英語も使えるし充分だろ。
君には充分なんだろうな
キリルとギリシャも含んでるしな アラビア、インドと中国を省く全世界の文字を網羅しているといっても過言じゃないな
そこまで気にするんだったら超漢字OSを使うしかないな。 あれなら海外SF作品の言語から指輪物語エルフの文字まで網羅してるもんな。
355 :
デフォルトの名無しさん :2010/10/17(日) 02:10:02
EUC、SJISはさっさと滅びろ。 こんなローカル文字コードに対応するのは時間の無駄以外の何物でもない。
WEBに関してはSJIS,EUCは滅びて欲しい
切り替えて使うISO-2022みたいのが正解だと思うんだけどな。
>>319 教本を参考にしてVC++2008でscanf使おうとするとビルドで警告が出るのですが、
どういう記述にするのがWindowsの作法なんですか?
/*今警告の出る記述*
int res;
scanf("%d", &res)
scanf_s
>>359 ,360
アリガトウございます。
scanf_sにしないといけないのですね。やってみます。
362 :
デフォルトの名無しさん :2010/10/17(日) 11:48:58
>>358 警告の文面はちゃんと読んだか?
Windows かどうかとは、あるいは VC かどうかとさえ関係ない内容だぞ
scanf_s を使えと言ってくるところだけが VC の癖で
あとは C の一般論だ
>warning C4996:'scanf':This function or variable may be unsafe. >Consider using scanf_s insted. >To disable deprecation, use _CRT_SECURE_NO_WARNINGS. >See online help for details. この警告の内容ってそういうことだったのですね・・・orz scanf_sにしたら警告、消えました。 ありがとうございます。。
>>257 C FAQって20年くらい前の情報だしな。
今はrand()ですむような用件ならrand()%Nで十分。
>>345 32ビットでも8ビットでも結局一文字の長さは可変長なんで、
コードを書く立場からするとUTF32でもべつに楽になるわけじゃないし
なんでもいい感じ。
文字を16bitで扱ってる言語とかOSとかむしろ失敗な感じ。
8ビットのままでよかった。
UTF32は固定長だろ
> warning C4996:'xxxx:This function or variable may be unsafe. 安全でない変数って例えば、どういうの?
たとえば10文字しかないバッファに11文字以上入れようとしたり
バッファサイズのチェックは実行時だから、それは違うと思う。
371 :
デフォルトの名無しさん :2010/10/17(日) 13:21:59
scanf の %d には gets のような意味のリスクはない
373 :
デフォルトの名無しさん :2010/10/17(日) 13:31:00
369
ヘッダーで_CRT_INSECURE_DEPRECATE_GLOBALSで定義されてるのがそうかな。 timezoneとかがそれに該当するらしいけど、なんで危険なんだろう。 グローバル変数でマルチスレッドと相性悪いのはわかるけど。
>セキュリティに関するメモ : >scanf で文字列を読み取る場合は、書式が %s の桁数を必ず指定してください。 >たとえば、"%s" ではなく、"%32s" と指定します。指定しなかった場合は、入力の書式が正しく指定されず、 >バッファ オーバーランが発生しやすくなります。または、scanf_s、_scanf_s_l、wscanf_s、_wscanf_s_l または fgets の使用を検討してください。
%dと%sは違うでしょ
一々フォーマットの中身をみて%dと%sでワーニングの内容を変える訳ないだろ??
M$「四の五の言わずに新しいの使っとけばいいんだよ」
>>377 フォーマットと実際に渡すポインタの型が違うと警告出すコンパイラも
あるんで、ありえなくはない。
>>377 gccはフォーマット文字列に対して正しい引数が渡されてる事を見るよ。
>>380 新しいの使っても、%sにint渡すエラーは解消できない。
>>371 あるだろ。char*を渡した場合とか。
char a[4];
scanf("%d", a+3);
たとえば、すべてが2バイト固定長の文字コードの場合、 あAいIうUえEおO という文字列なら、”あ”を読んだあと、2バイト先に”A”があり、さらに2バイト先に”い”があり、さらに2バイト先に”I”が記録されることになる。固定長なら。 これなら、単純に「一文字読む毎に、2バイトずつ進める」という簡単な動作だけで読めてしまう。だから簡単。 一文字が3バイト固定でも、4バイト固定でも、話は同じ感じになる。 4バイトで表現できる数字は、42億もあるので、これなら未来永劫、新文字などの割り当てスペースが足りないという問題は起こらないとおもう。 だから、4バイト固定長の文字コードがあっても良いのではないかなぁ…と個人的には思う。 UTF8の場合、文字コードのバイト長が可変なので、たとえば あAいIうUえEおO なら、”あ”を読んだあと、3バイト先に”A”があり、さらに1バイト先に”い”があり、さらに3バイト先に”I”が記録されることになる。可変長なので読むのがめんどくさい。 実はたいして難しいことはしてないのだけど、それでも、固定長を読むのよりは難しいと思う。難しいというか、めんどくさい。 文字コードの仕様の中に、可変長による圧縮効果を巧みに含めたって、仕方ないと思う。個人的に。 可変長にするための情報を、各文字に記録してるからこそ、可変長にできるわけで、その情報を記録する分だけ4バイト中で使えるビット数が少ない。 だからたとえば最大4バイトの可変長にしたとしても、その4バイトに記録できる文字種類は42億よりも少ない。 圧縮は、圧縮のそれでやればいいのであって、なにも文字コードの仕様の中に、結果的にデータが圧縮されるような巧みな仕組みを含めなくても良いとおもう。個人的に。 もしも通信量などを節約したいのならば、そういうデータ圧縮は、文字コードの仕様としては含めずに、別途、データ圧縮のそれに任せてしまえばいいと思う。 4バイト固定長のユニコードが普及してくれた方がありがたい。と思う。個人的に。なぜなら、その文字列はとても単純な構造の配列だろうから。書くのも読むのもずっと気軽で簡単だろうから。
長いから4バイトにまとめろ
無理
長文ウザイ 読む気がしない
長文読めない人間は文字コードの議論に参加しなくていいよ。お前らに関係ないから。
unicodeの規格で結合文字が最大どのくらい結合されるのかしらないけど、 一文字を固定長にしたかったら、少なくとも百数十ビットになる。
>>387 自分の言いたいことを短くまとめられない奴が言えるか?
いまどき一文字が32ビットで収まると思ってるやつも参加しないほうがいいよ。
392 :
デフォルトの名無しさん :2010/10/17(日) 15:04:33
>4バイトで表現できる数字は、42億もあるので、これなら未来永劫、新文字などの割り当てスペースが足りないという問題は起こらないとおもう。 初期のIPプロトコル設計者も同じような考えで失敗したわけだが。
>>391 結合文字でググったら、一文字15バイトもあるって書いてあるページがあった。
またバイトとビットの区別がついていない奴か
396 :
393 :2010/10/17(日) 15:08:05
>>396 そこのサイト
書いた人間の性格の悪さがにじみ出るキモイ文章だな
398 :
デフォルトの名無しさん :2010/10/17(日) 15:18:21
結合文字の「1文字」に必要なバイト数が多くなるのはUnicodeのせいではないだろw Unicodeは結合文字の扱いを定義しているからそれを文字として表せるのであって、 他の文字コードで同様のことをやろうと思えば、同程度のバイト数と、別途結合文字を形成するためのロジックが必要になる。 そういう意味では、むしろ別途ロジックが必要にならないUnicodeの方が結合文字に必要なバイト数は少なくて済む、といえる。
399 :
デフォルトの名無しさん :2010/10/17(日) 15:24:08
>>382 char a[4];
gets(a + 3);
こんなの gets が悪いんじゃない
そもそも「1文字」の単位として byte があるんだから、 1 byte に納まりきらなかったなら byte の bit 幅の方を拡張するのが筋ってものだろう。 英語圏なら 8 ビットで充分だったからそうなってるだけだろ。 そんなもんそのまま受け入れる義理は無い。 ちゃんと1文字が 1 byte に入るように設計しろ。
可変長で扱いやすい仕組みにすべきだったな Unicodeは設計の根底部分が間違っている
402 :
デフォルトの名無しさん :2010/10/17(日) 17:14:16
UTF-8は可変長で扱いやすいが?
UTF-8はエンコーディングだ もっともUTF-8が無けりゃUnicodeは死んでいた それなら元から可変長前提にしていれば良かったってこと
可変長前提で作るなら文字列ベースのバイナリフォーマットで定義すればいいのに ジジイの思考は無駄が多いよねー
405 :
デフォルトの名無しさん :2010/10/17(日) 17:26:09
>>403 は?
じゃあ、文字集合のUCS-4に何か問題があるのか?
可変長にするまでもなく、まだまだ文字を増やす余地があるのだが。
そもそも文字集合はエンコーディングを前提とするものだろう。
お前が何を可変長前提にしていればよかったと言っているのか全くわからん。
わからんならレスしなくてもいいよ
407 :
デフォルトの名無しさん :2010/10/17(日) 17:31:22
そうだな。
>>403 のトンチンカンな書き込みに反応したのは正直無駄だった。
Cで書いたプログラムを他の人も 起動できるようにするには如何すれば良いんですか? あとソースを書くときにはVisual C++ 2010を使ってます。
他の人が起動できなくする方が難しいと思う。
>>410 MSVCR100.dll が見つからなかったため、このアプリケーションを
開始できませんでした。アプリケーションをインストールし直すと
この問題は解決される場合があります。
と出て他の人は起動できないらしいです
MSVCR100.dll が何なのかは調べたのか?
>>409 RCの設定を
/MD(/MDd)から/MT(/MTd)に変更すれば
ランタイムインストールして貰わなくても動くよ
デバッグビルドは放流しちゃダメ〜
418 :
393 :2010/10/17(日) 20:52:43
>>398 まあ、いい悪いの話じゃなくて、一文字を固定長にしてどうこうみたいな
話は成り立たないねって話。
>>400 文字列の操作を、バイトとかビットとか意識しないで扱えるようにするほうが
いいだろうね。
だから、文字コードの1文字のバイト数の議論に、統合文字を出すのがおかしいって話だろ。
420 :
393 :2010/10/17(日) 21:04:08
>>419 おかしくはないよ。
途中でぶった切れないんだから、一文字として扱わないと。
C#とかちゃんと一文字としてあつかってる。
だから他のスレでやれっつってんだろーが
>>420 おk。
お前とは話が噛み合わないみたい。
423 :
393 :2010/10/17(日) 21:15:20
そもそも一文字32ビットにすれば、処理が単純になっていいよねって話なんでしょ。 で、結合文字があるから結局マルチバイトのエンコーディングの文字列と 処理の手間は変わらない、一文字一バイトでいいよって反論。 それに結合文字は関係ないって言ってもしょうがない。 実際の処理で無視できないんだから。
ホントに人の話を聞かない奴らだな。 文字コードの話は専用のスレがあるんだからそこでやれ。 言ってる意味わかるか? そこでやれ。
425 :
393 :2010/10/17(日) 21:22:41
ワンセグに対応しない携帯電話があっていいように、統合文字に対応しない文字処理系も当然ある。 統合文字に対応しなければUnicodeのエンコーディングは基本的に高々4バイトだ。
ふひょっ
429 :
393 :2010/10/17(日) 21:29:21
>>426 ま、個々のアプリとかシステムなら、入ってるときに結合文字ははじいて
中身は32ビット固定で処理するとかありかもな。
でも上のほうで32ビットにすればいいって言ってたやつはそういう意味じゃ
なかっただろ。
俺の働いてるようなITドカタの現場だとサロゲートペアにさえ対応しない。
その意味じゃ16ビットでも十分だな。
431 :
393 :2010/10/17(日) 21:32:07
でも、一文字32ビットで処理してる処理系ってあんまりなさそうだし、 わざわざ一文字32ビットの処理を手作りしてサロゲートペアのみ対応って 中途半端だな。
>>431 死ね
お前が存在することなんて誰も望んでないから
喜んでくたばれ
433 :
デフォルトの名無しさん :2010/10/17(日) 21:33:35
だから、UTF-8でいいって。 EUC、SJISは滅びろ。
だから、UTF-8でいいって。 EUC、SJISは滅びろ。
436 :
デフォルトの名無しさん :2010/10/17(日) 21:43:04
だから、UTF-8でいいって。 EUC、SJISは滅びろ。
大事なことなので2回言いました。
438 :
デフォルトの名無しさん :2010/10/17(日) 21:44:17
大事なことなので2回言いました。
UTF-8 が日本で流行ることは無いだろう。 無駄すぎる。
国内のユニコードで一番のシェアはUTF8だろ。 unixの標準もこれだろ。
だからスレチだとry
何が無駄なのか。意味不明。 そもそも、既にUTF-8は流行ってるし。
443 :
デフォルトの名無しさん :2010/10/17(日) 22:06:43
トリップつけてくんない?
データ量が肥大するだろ。 なんで英語圏の連中の都合に合わせて窮屈な思いしなきゃならんのだ。
446 :
デフォルトの名無しさん :2010/10/17(日) 22:09:18
>>444 お前は今すぐ画像非表示にして、Youtubeとニコ動には絶対アクセスするな。
447 :
デフォルトの名無しさん :2010/10/17(日) 22:10:34
標準入力から一文字単位に読み、0から256までの値がそれぞれ何回 出てきたかという回数を標準出力に出力するプログラムなのですが #include <stdio.h> #define MAXCHAR 256 main() { int count[MAXCHAR]; int c; int i; for (i = 0; i < MAXCHAR; i++) count[i] = 0; while ((c = getchar()) != EOF) count[c]++; for (i = 0; i < MAXCHAR; i++) printf("%d: %d\n", i, count[i]); } エラーが出てしまいました。どこが間違っているんですか
とりあえず、{}をきちんとつけよう
449 :
393 :2010/10/17(日) 22:15:06
そのうちUTF-8に収束しそうだけど、ITドカタとか異様にSJISとかEUC好きがいるからな。
452 :
デフォルトの名無しさん :2010/10/17(日) 22:20:56
>>447 0から256って段階でイヤな感じの問題だな。
453 :
デフォルトの名無しさん :2010/10/17(日) 22:24:36
>>447 return 0; とかがないからじゃないの。
main()って書いても、実際は int main(void) なんでしょ。
それは警告出るだけじゃね
警告のことをエラーって言ってる可能性もあるな。
456 :
デフォルトの名無しさん :2010/10/17(日) 22:44:53
>>447 全角スペースを抜いたら、私の環境ではちゃんとうごきました。
>>456 一箇所だけ不自然にインデントが入ってるところ。
>>456 count[c]++;
for (i = 0; i < MAXCHAR; i++) <---- この行の頭に二つ
printf("%d: %d\n", i, count[i]);
エディタに何を使ってるのかしらんが、今すぐ全角スペースを表示する設定に変えるべき
461 :
デフォルトの名無しさん :2010/10/17(日) 22:48:48
そういうミスするならインデントしてくれるエディタ使え
全角スペースを可視化するエディタ使え
463 :
デフォルトの名無しさん :2010/10/17(日) 22:54:55
インデントはTabキーだろ
CP437を使え。
465 :
デフォルトの名無しさん :2010/10/17(日) 22:59:19
ありがとうございます
>>462-
>>463 メモ帳でソースファイルを作成しています。エディタでいいの教えてください
466 :
デフォルトの名無しさん :2010/10/17(日) 23:00:03
VimとかEmacsとか勧める奴
468 :
デフォルトの名無しさん :2010/10/17(日) 23:01:49
「入門vi」は分かりやすい
エディタじゃなくて文字セットを変えろっての。 バックスラッシュ表示できないと不便だろ。 ??/ みたいに書かないといけないから面倒だし。
472 :
デフォルトの名無しさん :2010/10/17(日) 23:04:33
ども みんな頼りになります
473 :
デフォルトの名無しさん :2010/10/17(日) 23:06:49
バックスラッシュと同じコードポイントで文字が表示されない文字セットなんてあるの?
便意があるのに便が出ません。 どうすればいいですか?
便秘薬でも飲めば
それは便秘です
ラジヲ体操 ・からだを横にまげる運動 ・からだをねじる運動 をシツコク行います。
てっとりばやく浣腸で。
エディターなら EDLIN 使えよ。色々と捲るぞ。
481 :
デフォルトの名無しさん :2010/10/17(日) 23:56:41
ネタにもならん
みんなでエディターつくってあげれば? C言語で。 初心者向けのいい講座になるでしょう。
スレ違い
エディタが初心者向け?
エディタはハッカーが作らないとさ
きゅきゅっ
連結リストとかギャップバッファとかやるのかね EDITコントロール貼り付けるだけじゃだめか?
そんなの誰が使うんだよ
491 :
デフォルトの名無しさん :2010/10/18(月) 00:48:24
DOS窓で使うCUIのエディタを作るのは覚えて一年くらいの人には良い勉強かも知れないね まぁ使い物になるモノはできないだろうけど
>>489 必要になるアルゴリズムを列挙してみなよ
できるならねw
>>492 <-誰かこいつのバカさ加減をとめてくれないか?
アルゴリズムだとさ、笑い過ぎて腹痛い。
流れをブッタ切って本当に悪いんだが… 俺は専門学校に通っていて、周りはC、C++をあまりやらずに ゲームプログラミングをしている。俺は意味も分からないまま プログラミングをするのが嫌だから、CとC++の本を読んで 勉強しているんだけど…このままじゃダメなのかな… クラスの人たちは何だかんだで3Dゲーム(学校のライブラリを使っている) を作ったりしてるし、凄い置いていかれた気分になってしまった…
C++がわからないのに3Dのゲーム作れるはずがないだろ
>>494 ダメだな。だいたい空気読めないみたいだし。
むいてないよ。やめたら?
基礎の無いままで何を積み上げても無意味だよ。
>>494 はったりの世界でもあるからとりあえずなんか作ることも必要。
クラスの連中がやってることは軽くこなした上で
基礎を追い求めるくらいの意気込みが必要。
C++もゲームプログラミングも両方やらないと駄目に決まってるだろ
>>494 専門学校ではほとんど学校側がソースコードを組んであって
ほんの少しパラメータを弄ったりしているだけという書き込みを見たことがある
それが本当ならツクールを弄ってるのと変わらないだろうから焦る必要は全く無い
>>494 つうかその話をここで続けるつもりならコテつけてくれないかな
一番いらないのがC++だな。 基礎と3Dはやったほうがいい。 正直専門やゲーム会社新卒レベルのC++なんてひどいもん。
あと実践踏まないで基礎など理解できるわけもない。
Cを習得する+3Dゲームを1から作る を1年で出来ないなら辞めちまえ
やっぱり面接でFizzBuzzするべき?
C++いらないとかヤバいだろ クラスを使わずC言語のみで開発するのか
C++のまえにメモリ管理やポインタすら怪しいやつが多すぎだから
釣りだから。ヤベーお前らバカじゃね?マジレスしてんじゃねーよ! 笑うっっw
動作のコストは掛かるかもしれないが。 とりあえず動かすという観点でSTLは使えるだろ C言語で文字列操作、動的なメモリ確保したら多くのコードがいるぞ。
そんなレベルじゃ仕事のコードは書かせられない。
STLやC++が禁止でない限りは、 使った方が成果/労働の比率は良くなるだろうって事。 STLがもしボトルネックでも完成後にパフォーマンス調べられるし。
仕様 le ファイル名 ins 10 3 A で、ファイルの10行目、3文字目に、文字Aを挿入する。 例:ABCD → ABACD le ファイル名 clear 10 3 で、ファイルの10行目、3文字目の文字を切り取って消去する。 例:ABCD → ABD le をできる限り短い行数で実装せよ。ただしlibc以外のライブラリを使用してはならない。
行数か あんまりいい指標じゃないと思うんだが
じゃあバイト数で
;で一行とカウント。
494です。わざわざ俺なんかのためにレスしてくれてありがとう! 凄いやる気が出たよ!これからは両方頑張ってみます! 本当にありがとう!!
つまらん。 もう寝るワ
スレ違いっつーか板違い。マ板でやれ。
520 :
デフォルトの名無しさん :2010/10/18(月) 14:10:49
うひゃー。くまちゃんだよー☆
521 :
デフォルトの名無しさん :2010/10/18(月) 14:56:01
楕円曲線の計算なのですが、アフィン座標から射影座標に変換すると 正しく位数が計算されません。正確には無限遠点の数が変わってしまいます。 スレ違いかもしれませんが知っている人がいたらどうすればいいのか 教えてください。
ポインタ型にconstをつけると、値は参照できるけど、 変更できなくなるってことでいいですか?
適切なスレに行けばいいと思います。
急いでるから早くしてほしいです。
>>522 どこにconstをつけるかで異なります。
>>521 自分のあなるにおちんちんを入れればわかるよ
const int* test これならどうなりますか?
constなintを指すtest
ではそのようにすれば、testが指し示す値を書きかえれなくなるってことで いいでしょうか?
× アナル ○ アヌス
ローマ神話の出入り口と扉の神。前後2つの顔を持つのが特徴である。
532 :
デフォルトの名無しさん :2010/10/18(月) 15:46:27
C言語でオンラインFPSゲームのチートを作りたいのですが・・・ どこから何をやればいいのか全くわかりません・・・ 誰か教えてください
>>532 >ウイルス、ハッキング・クラッキングを求めるような発言は禁止です。
チートは「ウイルス、ハッキング・クラッキング」のいずれでもない。 風紀委員死ね。
>>535 残念ながらチートはハッキング・クラッキングに入る.
>>539 実行中のプログラムに他のプログラムから干渉してデータの改ざんを行うんだから
クラッキングには入りそうだけどな
つかオンラインゲームのFPSのチートとかになると運営側のサーバーをクラックしないとできないんじゃね?
例えば聖剣で敵に回復魔法かけてオーバーフローさせる手があったね。 あれはチート(ズル)に入ると思うけど、別に問題ない気がする。 そのゲームの利用規約に書いてある筈だよ。 クラッキングとかチート以前に、規約違反ってことになると思う。 その規約違反の種類がクラックだのチートってことでしょ。 昔クラック用サーバというのがあって、クラックして進入してよい、としてある。 進入したら、その脆弱部分を教えてもらって、セキュリティに役立てるとかするわけ。 今も探せばあるかもしれん。
> 実行中のプログラムに他のプログラムから干渉してデータの改ざんを行うんだから > クラッキングには入りそうだけどな バカ言え。アンチウイルスもそういうプログラムだが、クラッキングか?
クラッキングとハッキングは違う チートとグリッチ(バグ利用)は違う
それらはいずれも「現象」ではなく「行為」を指す言葉だ。 すなわち、それを行う目的によって変わる。 トロイの木馬はリモートサーバーにもなるし、ファイアーウォールはマルウェアにもなる。 んでスレ違いだからどっか行け。
このプログラムを実行したら、 bb aa 10, 10 と表示されました。 なんでaa, bbの順じゃないですか。 どういう仕組みでこういう順番になってますか。 #include <stdio.h> int main() { printf("%d, %d\n", puts("aa"), puts("bb")); return 0; }
実装が最適化できるように、関数引数をどういう順序で評価するかは決まってない aa bbでもbb aaでも仕様通り。そういうのに依存したコードは書いちゃダメ
548 :
デフォルトの名無しさん :2010/10/18(月) 22:40:20
引数が評価される順序は未定義
可変長引数はスタックにどの型の値が何個詰まれたかわからないんで、 フォーマット文字列がスタックの一番上に詰まれるようになってる。 (フォーマットを見て、値が何個つまれてるか判断する) それで右側から評価されてる。
規格の話をしているときに実装の話を持ち出す奴
>>550 なんかまずいの?
規格ではこうで、
>>545 の現象はこういうことでって説明で別に問題ないと思うけど。
>>549 コンパイル時に型も個数も分かっているからどうとでもなるよ
553 :
デフォルトの名無しさん :2010/10/18(月) 23:16:25
>>549 実装考えたらそうだね
逆に aa->bb の順で処理するのは面倒くさそうだ
スタックに引数が右から積まれるのって規格だっけ?(PASCAL型とかの例外が今は有るけど)
だとするならば引数は右から評価されるってのも規格の一部と言える気もする
>>552 呼び出された側のコンパイル時に決定してないだろアホか?
>>552 どうとでもなるけど、まあ、よくある実装の例を出しただけだよ。
>>553 C言語の規定にスタックなんぞ無い
それはCPUの都合だ
>>552 どうにもならない。呼び出され側はコンパイル時点で呼び出し側の個数も型もわからない。
第一引数でおしえてあげないといけない。
>>559 加算も出来ないCPUなんて使ってるのかよw
分割コンパイルとかしたことないのけ
呼び出され側がどうこう言ってる奴がおかしいだけ
>>559 Cでは無理だけど、最近の言語だと、カリー化で解決できたりするね
>>564 そんなことはないよ
スタックに積むってのは特別な事じゃない
特定箇所に値を書き込んでスタックポインタを進めているだけだから
SP+8 に書き込みとかで簡単に実現できる
x64ではスタックには乗せないのだ。
レジスタ渡しでも、可変長の時は呼び出された方でスタックに積んでるんじゃないの? gccでそういう事してるの見たことあるよ。
569 :
デフォルトの名無しさん :2010/10/19(火) 01:18:06
仕事でもないのにこんな時間までバグ取りしてやっと終わった。 アフィン座標と射影座標では無限遠点の表現が違っていて、判定条件を 知らないまま2日無駄にした。
入門者にお薦めのCPPは何がありますか?
ない
572 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/19(火) 09:46:38
まだこのウンコスレあったの きも
574 :
デフォルトの名無しさん :2010/10/19(火) 12:27:33
教えてほしいです。 JAVAからJNIの仕組みを利用してCのI/Fを使おうとしています。JAVA側から引数でint型で1を渡そうとしていますが受け取るC側でint型の1と認識できますか?
>>574 JNI で自動生成されるヘッダを正しく使うなら可能
多分ヘッダでは long になってると思うけどw
578 :
デフォルトの名無しさん :2010/10/19(火) 21:31:10
#include <stdio.h> int main(void) { printf("ああああああああ\tあああ\n"); printf("ああああ\tああああああああ\n"); return 0; } 揃わないんですけどどう解決したらいいですか?
文字コード変えてみろ。
そもそも「あ」の数が違うんですけど
TABはそういう風に使うもんじゃねえから
583 :
デフォルトの名無しさん :2010/10/19(火) 21:40:46
8字以上は揃わない
584 :
デフォルトの名無しさん :2010/10/19(火) 21:47:42
いや差が4字以上でしょ?
ああああああああ あああ ああああ ああああああああ こんな感じの出力を期待してるのかね。
荒らしツール僕も作りたいです
587 :
デフォルトの名無しさん :2010/10/19(火) 21:57:43
\tは最大で4字分のインデントを入れるそれ以上必要なら\t\tとかにする
588 :
デフォルトの名無しさん :2010/10/19(火) 22:00:51
このスレレベル低いね
お前に合わせてやってんだろ
まじで分からないわけじゃなくてかまって欲しくて、変な質問してるんだろ?
591 :
デフォルトの名無しさん :2010/10/19(火) 22:05:14
592 :
デフォルトの名無しさん :2010/10/19(火) 22:06:31
ここまで俺の自演
593 :
デフォルトの名無しさん :2010/10/19(火) 22:24:47
エラー直してください 今から二回に分けて貼ります /* * cat3 ファイルを連結して出力 * パラエータがないときには標準入力を処理 */ #include <stdio.h> #include <stdlib.h> void do_one(FILE *); void cant(char *); main(int argc, char **argv) { FILE *fp; --argc; /* argv[0]の分だけ減らす*/ ++argv; /* argv[0]を読み飛ばす*/ if (argc == 0) /* パラメータ無し */ do_one(stdin);/*標準入力を処理*/ else{ while (argc--){ if ((fp = fopen(*argv,"r")) == NULL) cant(*argv); do_one(fp); fclose(fp);
594 :
デフォルトの名無しさん :2010/10/19(火) 22:27:02
>>593 のつづき
argv++;
}
}
return (0);
}
void do_one(FILE *fp)
{
int c;
while ((c = fgetc(fp)) != EOF)
fputc(c,stdout);
}
void cant(char *name)
{
fprintf(stderr,
"can't open %s\n",name);
exit(1);
}
安価越しに見ても揃ってないし、codepadとかで上げればいいのに
if ((fp = fopen(*argv,"r")) == NULL) cant(*argv); >>>> else { do_one(fp); fclose(fp); >>>> }
#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { char cmd[100]; int cnt = 0; while(0 < --argc){ sprintf(cmd, "cat %s\0", argv[++cnt]); system(cmd); } return 0; }
>>596 exit()で終わってるから、それは関係ないだろ。
599 :
デフォルトの名無しさん :2010/10/19(火) 22:43:08
601 :
デフォルトの名無しさん :2010/10/19(火) 22:50:57
なんっで、そーなるのっ!
}ねえじゃん
せめてコンパイルの通るソースを出せww
607 :
デフォルトの名無しさん :2010/10/19(火) 22:56:36
おかしいな 教科書のとおりなんです エディタもメリーつかってるんですが
エラーか警告のメッセージも貼れや
このスレに貼ったコードは、とりあえずコンパイルは通るじゃん。 なんでcodepadに貼るときに改悪してるんだ。
610 :
デフォルトの名無しさん :2010/10/19(火) 23:00:29
>>606 1>c:\cprogram\test\cat3.c(20) : error C2181: else 文が if と一致しません。
1>c:\cprogram\test\cat3.c(33) : error C2143: 構文エラー : ';' が '型' の前にありません。
1>c:\cprogram\test\cat3.c(38) : error C2065: 'c' : 定義されていない識別子です。
1>c:\cprogram\test\cat3.c(39) : error C2065: 'c' : 定義されていない識別子です。
ようわからん
611 :
デフォルトの名無しさん :2010/10/19(火) 23:01:58
やっぱここの人たちレベル低いね
codepadに貼ったのは質問者なのか?
それとも
>>610 の馬鹿か?
入門スレだからそりゃそうだろ
>>610 20行目
× else{
○ }else{
35行目
× intc;
○ int c;
intの後に半角スペース
>>610 このスレにはってあるコードはそんなエラーでないだろ。
>>593-594 のソースなら
・C99でコンパイルしている(mainの戻り値の型なし)
・C++でコンパイルしている(同上)
・実行時エラーとコンパイル時警告の区別がつかない
のどれかだろう
616 :
デフォルトの名無しさん :2010/10/19(火) 23:09:29
↑ みなさんありがとうございます
解決しました
>>614 ちょこちょこ変えてた
617 :
デフォルトの名無しさん :2010/10/19(火) 23:14:39
>>616 のコンパイル結果です(Cygwin
$ gcc cat3,c
gcc: cat3,c: No such file or directory
gcc: no input files
,(カンマ)と.(ピリオド)
619 :
デフォルトの名無しさん :2010/10/19(火) 23:25:40
620 :
デフォルトの名無しさん :2010/10/19(火) 23:32:11
>>613 のとおりなおしたらおkでした
お騒がしてすみません
なんだったんだろう。うんこの切れが悪いような気持ち悪さだ。
622 :
デフォルトの名無しさん :2010/10/20(水) 00:24:04
voidにしているのにreturn入れる意味はエラーチェックできるぐらいしかない?
ハァ?
残りの処理をすっとばして終了したい時とか
625 :
デフォルトの名無しさん :2010/10/20(水) 00:26:37
626 :
デフォルトの名無しさん :2010/10/20(水) 00:57:13
超初歩的なことかもしれないが教えてください gtのファイルをUSBに入れて違うパソコンで作業したいんだが コンパイルするとcannot output…みたいに出てきてしまうんだが、どうすればいい 自分のパソコンは修理中
どうやってUSBに入れたんだ
628 :
デフォルトの名無しさん :2010/10/20(水) 01:48:29
質問させて頂きます。 以下のリスト構造を作ったのですが新しいセルを作って 構造体のname[32]に文字列を入力する時にgets(mp -> name)にすると 氏名入力 ---> 年齢入力 ---> みたいな感じで氏名入力が飛ばされてしまうのですが scanf("%s", mp -> name)にすると上手くいきます。 またscanf("%s", &mp -> name)でも何故か動きました。 理由を考えたのですがどうしても分からなかったので つたない説明ですがエスパーの方おりましたらお願いします。
typedef struct Data { char name[32]; int age; struct Data *next; } Meibo; void write_meibo(Meibo *head) { Meibo *p, *mp; int a; p = head; while (p -> next != NULL) { p = p -> next; } mp = (Meibo*)malloc(sizeof(Meibo)); if (mp == NULL) { perror("メモリ確保に失敗しました\n"); exit(-1); } printf("氏名入力 ---> "); scanf("%s", mp -> name); /* gets(mp -> name)では出来ない printf("年齢入力 ---> "); scanf("%d", &(mp -> age)); mp -> next = NULL; p -> next = mp; }
632 :
デフォルトの名無しさん :2010/10/20(水) 02:01:22
なるほどありがとうございました
633 :
デフォルトの名無しさん :2010/10/20(水) 02:12:11
>>629 ドラッグだよ
やはり他のパソコンで1から環境設定とかインストールしないといけないの?
634 :
デフォルトの名無しさん :2010/10/20(水) 02:12:56
パス通せ
635 :
デフォルトの名無しさん :2010/10/20(水) 02:13:37
センタリング
/ ̄ ̄\ 落ち着け / _ノ \ | u ( ●)(●) ____ . | (__人__) /::::::::: u\ | ` ⌒´ノ/ノ└ \,三_ノ\ ,∩__ . | /::::::⌒( ●)三(●)\ fつuu . ヽ |:::::::::::::::::⌒(__人__)⌒ | | | ヽ \:::::::::: ` ⌒´ ,/ _ | | /  ̄\ /⌒ .ヽ i 丿 | ヽ、 \/ /(⌒) ξ) ̄ ̄´ \ ./ / / |
>>630 gets() と scanf() の仕様による
gets() は \n の検出で処理を完了するが scanf() は終端の \n を読み取らない為、バッファに残す
よって scanf() の直後に gets() を呼ぶと gets() はバッファに残った \n を取得し即時終了する
while( 1 ) {
printf( "Name>" );
gets( name );
printf( "Age>" );
scanf( "%d", &age );
}
上記処理において一回目の gets() は正常に動作するが、2回目以降は即時終了となるために Name>Age> と表示される
638 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/20(水) 12:25:35
まだこのスレあったの? きも
まだこのコテハン居たの? きも
ま________の? きも 巻物?なんか忍者っぽいな
Q.20世紀の中で、月の初め(1日)の曜日が日曜日になっているのは何回あるか?
という問題を解いていて、困っています。
サイトでツェラーの公式を見つけたので、以下の公式を使って解いています。
h百y年m月d日の曜日を求めることを考える。
(例えば、2001年11月3日の場合、h=20、y=1、m=11、d=3 である)
(注意) 1月、2月は、前の年の13月、14月として計算する。
W = y+[y/4]+[h/4]−2h+[13(m+1)/5]+d
土日月火水木金土 = 0123456 に対応
解いてみたプログラムがこちらです。
http://codepad.org/3g3tX4iN 答えは171 らしいですが、どうしても正解に辿り着けません。
どこが間違っているか、ご指摘お願いします。
>>641 Wを7で割ったmodの値が曜日に変換されます
>>641 > 土日月火水木金土 = 0123456 に対応
土曜日が二回ある
日曜日は0じゃなかったかな
>>643 あ、ほんとだ。
この公式では
0123456が
土日月火水木金
に対応してるみたいです。
1年を3〜14月でやってるだけで (注意) 1月、2月は、””前の年””の13月、14月として計算する。 が入ってない
なんだこの読み難いコードは。
タブの設定を4にしてくれ
>>637 よく分かりました。
ありがとうございました。
>>645 1月が13とみなされ、
2月が14とみなされるので、
3〜14の間をループさせるように作りました。
>>645 すいません・・・。
>>644 プログラムは別のサイトで見つけてきたりしてない?
使いやすいようにずらしてあると思うんだけど
>>651 -1じゃなくて-6だな
あと
>>645 に対応する必要があるけど
このままだと1901年3月から2001年2月になるような
>>653 3から始まってるので、
3月→4月→5→6→7→8→9→10→11→12
となりますが、
12→13(1月)→14(2月)
という風に、12月から1月、2月と、回ってきます。
-6にしたら答えに辿り着きました
ありがとうございました
1901年の1月2月を2001年の1月2月と同じ曜日とみなして問題ないの?
シーーー!
>>654 >>645 はわざわざ「前の年」を強調してくれてるんだから少しは聞く耳を持とうよ
答えだけあっててもしょうがないだろうに
659 :
デフォルトの名無しさん :2010/10/20(水) 20:12:12
C言語を最近勉強し始めました。 scanf("%d",&n);でnに正の整数を入力する。次にn回正の整数を入力。 そのうち、奇数のものの個数を求めて出力するプログラムを作れ。 という問題があるのですが、どうあがいても作ることが出来ません・・。 for文・while文・if文などを使ってみましたが失敗しました。 プログラムを教えてください。お願いします。
>>659 ifの条件をn%2==1にしてその時だけカウントすればいいじゃないか
661 :
デフォルトの名無しさん :2010/10/20(水) 20:17:29
>>660 if(n%2==1)++a;
というふうにはやってあります。
たぶんプログラム全体的におかしくて個数が出ないんだとおもいます・・・。
もうやめればいいじゃないか。
while ((c = getchar()) != EOF){ putchar(c); } これをもっと簡潔に書く方法ってない? 判定の二重括弧が見苦しい気がするんだけど。 これが if なら単純に外に出せるから c = getchar(); if ( c != EOF ){ putchar(c); } こうできるんだけど、 while で外出しすると また内側にも書かないとならなくなるし。
いや、それはもう展開するしかないかと。 for (;;) { c = getchar(); if (c == EOF) break; putchar(c); } おれも条件式の中で代入も一緒に、ってのはなるべく避けてる。
>>626 >>違うパソコン
Windows かLinux またはMac どれなんだ。また、コンパイラは何を使ってんだ?
>>663 こういう書き方は、C では当たり前のイデオムなのですけれども。
僕はsaikin、macに変えました
括弧がイヤなだけならカンマ演算子はどうだ while (c = getchar(), c != EOF){ putchar(c); }
まぁ括弧消したいのにこだわるなら do{ c = getchar(); } while(c != EOF && putchar(c)); とかになるんだろうけど、 軽くバッドノウハウかな。 while(c != EOF && putchar(c) != EOF); とすればputchar(c)のエラー処理と言えなくもないけど、 条件が作用を伴うのはあまり良い作法とは思わない。
おまえら普通にかけよ。 ヘタくそは工夫するな。
ぷっぷっ
ケツからメタン漏れてるぞ
ファイル入出力に関する質問です。 data.txt ----- 7 20 1 2 3 4 5 6 7 ---- のような形式のファイルがあるとして(最初の7は、2行目の数の個数を表してます)、 int a, b, c[100]; の変数について、 a = 7 b = 20 c[0] = 1 c[1] = 2 .... となるように格納したいのですがどうしたら良いでしょうか。 FILE *fp; fp = fopen(data.txt, "r"); if(fp == NULL){ puts("ERROR"); exit(-1);} fscanf(fp, "%d %d", &a, &b); こっから分かりません…。1行目のaの値により、2行目の数の個数が変わるあたりをどうしたらよいのか…。
// 宣言部で int i ; for ( i = 0 ; i < a ; i++ ){ fscanf ( fp, "%d", &c[i] ) ; }
1行目の20がなんなのか気になるw
「行」を意識するなら fgets で取得するのがよろしいかと思われます。
679 :
デフォルトの名無しさん :2010/10/21(木) 00:22:49
>>676 ,677,678
fscanfで出来ました!
ありがとうございました!
A.cというソースでB.cに書かれたDLLを利用したいとき その中の関数の仮引数を構造体にした場合は、A.cとB.cで 共通のヘッダーファイルを用意して、定義しておけばよいですか? それ以外の方法もあれば教えてください
B.cからDLLが作られている、という前提でいいですか? 基本的には公開情報だけをB.hに書いて、 A.cからそれをincludeすればいいと思います。 構造体に関してはちょっと問題が出る事あるけど、まぁ、とりあえずこれで。
682 :
デフォルトの名無しさん :2010/10/21(木) 12:27:58
初心者です。 "入力文字列のアルファベットを全て大文字にして表示せよ" の問題が分かりません。
宿題スレに行って下さい
>>682 #include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char **argv)
{
char buf[256];
char *p;
scanf("%s", buf);
for (p = buf; *p != '\0'; p++) {
*p = toupper(*p);
}
printf("%s\n", buf);
return EXIT_SUCCESS;
}
直書き。コンパイル確認すらしてない。
685 :
682 :2010/10/21(木) 13:00:48
>>683 さん
調べてみましたが落ちてるようです・・・
>>684 さん
出来てました。ありがとうございます。
すいませんがあと一つだけ分からない問題があります。
"入力文字列に小文字のアルファベットが何文字含まれているか出力せよ"
あつかましくてすいません。
687 :
682 :2010/10/21(木) 13:12:30
686さん 見落としてたようです。 スレ違いな質問をしてすいませんでした。
ARGB8888のバイトデータから全ピクセルデータを配列に格納するアルゴリズムください。
すいません int型をchar型に変換するときに上位の0を簡単に表示させるにはどうしたらいいでしょうか? 今の状態だと、例えば int a = 180 を char b にいれるのに sprintf(b."「%5d」",a); とすると 「 180」 と出力されてしまいます。 これを 「00180」 と出力させたいです。
b. → b, でした
%05d
char bだとコンパイルエラーの気もするけど %05dにすればいい
質問です下のコードで #include <stdio.h> int main(void) { int a, b, c; int max; printf("整数aの値:"); scanf("%d", &a); printf("整数bの値:"); scanf("%d", &b); printf("整数cの値:"); scanf("%d", &c); max = a; if (b > max) max = b; if (c > max) max = c; printf("最大値は%dです。\n", max); return (0); } コマンドプロンプトで「最大値は〜です」が表示されずに コマンドプロンプトが終了してしまいます また下のコードでも #include <stdio.h> int main(void) { printf("hello"); return 0; } でも文字が表示されずにコマンドプロンプトが終了してしまいます どこか環境設定がおかしいのでしょうか?
表示されないわけではない 表示された直後に一瞬で終了するから内容を見る間がないだけだ あなたのプログラムはprintfで表示した直後にreturnで終了しているのでその通りに動作しているというわけだ
次にお前は「すぐに終了しないようにするにはどうしたらいいでしょう」と聞く。
charやintを含む構造体内の重複する文字列を、一方は残し、もう一方は削除したいと思っています。 文字列のソートは済ましているので後は比較し削除するだけなのですが、 nextポインタをどの様に扱えばよいのか分かりません。 何方かご教授お願いします。
出来上がった実行ファイルをダブルクリックすると そのアプリケーションの終了と同時にコマンドプロンプトは閉じるのが Windows の仕様 多分表示されてるんだけど、即閉じてるのでわからないだけ スタートメニューからコマンドプロンプト開いて、 その窓へ向かって実行ファイルを D&D [Enter] してみそ
>>699 残念だが、遅いよ。遅すぎるんだよw
>>698 あんたも説明が下手だな。具体例を提示してくれ。
いきなりnextポインタと言われてもなんのことやら。
ひょっひょっ
きゃっきゃっ
704 :
デフォルトの名無しさん :2010/10/21(木) 18:35:19
>>698 片方向リンクのリスト構造か?
struct node {
char a[16];
int b;
struct node* next;
} NODE;
みたいな感じの
BF:F0 FF:00 0A:BF これをC言語一行に直してみてくれ
げほっげほっ
>>698 消す一個先を消す一個前につなげるだけでしょ
要望に色々なバージョンが考えられ得るからね 削除前の順を維持したいのか重複削除を適用後の順を取り出したいのか適用後として空要素の順を何時何処の情報で並び替えるのか
typedefについての質問です #include <stdio.h> struct value_tag { int value1; int value2; char value3[64]; }; typedef struct value_tag value; int main() { value_tag.value1 = 10; printf("value_tag.value1 = %d",value_tag.value1); } やりたいことは構造体内にある変数value1に10を代入してそれを表示するんですが いまいちうまく行かなくて・・・structだけ使えばいいじゃないかと思うかもしれませんが どのように使うか理解しておきたくて。。。 ご教示お願いします
まずintをtypedefから始めてみそ
何が聞きたいかよく分からんが (例1) struct value_tag { int value1; int value2; char value3[64]; } ; typedef struct value_tag value; int main(){ value v ; v.value1 = 10; printf("value_tag.value1 = %d", v.value1) ; } (例2) typedef struct value_tag { int value1; int value2; char value3[64]; } value; int main(){ value v; v.value1 = 10; printf("value_tag.value1 = %d", v.value1); }
いちいち名前変えるやつウゼエ typedef HOGE HOGE; struct HOGE{ }; ちゃんと名前空間が分かれてるんだから いちいち tag とか _ とか付けてんじゃねーよボケ
訂正: typedef HOGE HOGE; ↓ typedef struct HOGE HOGE; 興奮しすぎてミスった悪い。
typedef struct { int value1; int value2; char value3[64]; } value; で解決
718 :
711 :2010/10/21(木) 23:35:29
>>713 を見て
> value v;
このvってのが構造体変数で、valueが構造体タグ名で合ってますよね?
value_tagってのが何なのかわからないです
まずtypedef自体、構造体をコピーしているのか、名前を変えているのか良くわからない状況です
いろいろググったりしても、データ型に新しい名前をつけるものとしか出ず、チンプンカンプンです
特に意味は無いから気にしなくておk
構造体どころか、変数の基礎すら理解できてないようにも見えるw
てめーはtypedefを使うな
まあ一般的には typedef 使わなきゃならない部分ってのは無いよな。
初心者スレなんだからもっと優しく説明するんだ
今後ともtypedefはお使いにならないでください。
#defineを使うんだ!
typedef は型に別名を付けるだけだよ。 プリプロセッス時に置き換える #define とは違って、コンパイル時まで名前は残る。 単に struct を省略したいだけの目的なら typedef なんか使わず C++ にでも行ったほうがいい。
オッス!おらプリプロセッス!
プロセッス → プロセッサ プロセス → プロセサ プロセス →?→ プロセッサ
プロセス → プロセサー だろ。 語尾の棒を省略するやつウゼエんだよ。 プリンター、ブラウザー、ポインター、ドライバー、 1文字省略したくらいで何が嬉しいの? 馬鹿なの? そのクセ、「ハッカ」とか「コピ」とか言わねーんだからアホとしか言いようがない。
>>729 日本語で考えるから混乱する。
process → processor
ss と重なる部分を促音で書く人もおればそうじゃないひともいるのだろう。
Process -> Processer
>>732 辞書をひいたか?手元の辞書にはそれはない。
ハッカよりニッキが好きだったけど、あれ中国産が多いんだよな。 自分で買えばベトナム産も選べるけど、加工品に使われてるものは選べないから困る。 ヤツハシとかどうなんだろうか。ニッキは好きなんだけどそれが不安で手が出せない。
そういえば、グーグルも日本とかアジア圏だけじゃね? ネイティブの発音は日本人には「ゴォゴ(ル)」に聞こえる。
>>730 英語でつづると -er -or になる部分は長音記号をつけないという決まりがあった。
これによると、「ハッカ」はあり得る。「コピ」は er, or で終わっていないのでありえない。
ただし検索結果は尻から出る
コピつったら韓国語でコーヒーのことだぞ
マイクロソフトはもう止めたんだろ。 今後は伸ばすのが標準化するよ。
プログラムー。 デバッグー。 コンパイルー。
742 :
デフォルトの名無しさん :2010/10/22(金) 01:40:32
。までが標準?
単語をころころ変えられると、マニュアル書くのがほんとめんどくさい マイコンピュータ(またはコンピュータ、コンピューター)を〜とか書くのまじめんどい
基本カタカナ外来語が踊り狂う技術文書には末尾の長音は含めない。マイクロソフトの方針がなんだろうと関係ない。
森博嗣の小説もコーヒー以外は全部伸ばさないから、バッターをバッタとか書いてる
>>738 国語審議会のとある長老のありがたき御意見だったという噂を耳にしたことがあります。それをJIS が鵜呑みにしてしまったとか。
マイクロソフトは長音記号を一律に復活してしまって、それはそれでもめてるらしいとか。
言文一致を前提にすると聞いたようにかいていい、ということになりますから正書法を定めるのはなかなかむずかしいですね。
748 :
746 :2010/10/22(金) 03:18:42
木村泉氏の著作で読んだ記憶があります。参考までに。
旧JISではコピーみたいに3文字になる場合は「ー」をつけて コンピュータみたいに4文字以上になる場合は「ー」をつけないじゃなかったか 最近JISが変更されてコンピュータがコンピューターになったとか
早く質問しろよボケ 使えねー奴らだな
配列のポインタを関数の引数として渡すときは (*a)[] ポインタの配列を渡すときは(**a)で良いんでしょうか?
またポインタの配列は*a[]、 また配列の配列を渡すときはa[][],、(*a)[]という形で良いでしょうか?
2次配列?
うん。
おれのお腹には四次元配列がついている。 なんでも入るよ。
渡せませんでした(>_<)
今渡しとかないと、後で後悔するぞ
でも今渡しても今後悔するだけ
俺の想いがたくさん詰まったboolean配列をあなたのポインタに渡したい・・・・
渡そうとしても受け取ってくれませんでした(>_<)
オレに渡したら勝手にfreeしてくれてやる
>>760 実際に渡してみたら上手くいきました。
ありがとうございました。
いろいろアプリケーションが世の中にはありますが ああいうのをを作るにはどのくらいの勉強が必要ですか? 入門書を何とか読み終えたのですが やった問題もn乗を求めるとかファイル中の最高値を出力するとかだけで これで何か作れと言われてもどうすればいいのかわからん状態です
そこで詰まるようならものつくりなんて君には一生無理なんじゃないかな
本屋にいけばゲーム開発入門とか売ってるからそれを読めばいい そこに書いてあるコードは入門書がちゃんとわかってるなら読めるはず 読めないならまだ入門書すらわかってないってこと
>>769 そこまで行けたなら、もう作れるはずだよ。
わからんというなら、その作ろうとしてるものの構造を理解してないだけ。
とりあえず簡単なものから作ってみればいい。テキストエディターとか。
蔵書プログラムなんてどう?
作りたいものがないなら何も作る気にならんだろう
バイナリエディタとかも作れるよ。
>>769 14歳からはじめるC言語わくわくゲームプログラミング教室とかでDirectX使ってゲームでも作るよろし
そのタイトルって二十歳過ぎると手出しにくいわ
いろいろありがとうございます
ゲームの本を探してパックマンやオセロ作ろうと思います
アルゴリズムの勉強にもなりそうですし
>>770 難しいですね・・・
>>774 プロキシ検索ソフトやメモ帳風ブラウザなど作りたいというか欲しいのがあります
現状のソフトでこれをああできたらいいのになあ・・という部分もあるので
clibのコンソールアプリからWin32のAPIとかに行くのも一つの壁だと思う。 少なくともオレの場合はそうだった。 HWNDとか、UINTとか、HINSTANCEとか、おまえら何?って。 でもそれが何なのか、知る必要は(少なくとも今は)無いと知って、 そういうもんだと思って乗り切ったよ。 ある種の抽象化/隠蔽なんだよ。
UINT はそのままだろw
>>777 まぁDirectX初めて触るとかだったらまぁ良いけどな。
なんであんな名前にしたんだろw
DirectX は C++ だからスレ違いだろ。
>>780 そうなんだけど、中学生のオレには分からなかったんだよw
つまり、unsigned intならunsigned intとすればいいのに、
なんでUINTなんてtypedefしているのか。
それ以前に、「おいおいC言語の本にねーよそんなの」状態だったけど。
スペルが難しいよね。unsignedってさ。
厨坊のオレはアンシグネドとか読んでいたよww
>>786 おま・・・amazonも無い時代だったんだよ。
田舎の本屋にWindowsプログラミングの本なんて無い。
VC4.0のわけの分からん分厚いマニュアルのサンプルとか、
BASICマガジンとか、そんくらいしかなかったんよ。
今思えば、東京の本屋にでも旅行しに行けばよかったかもな。
話は違うんだけど皆ってちゃんと正しいタイピングしてる? 俺は本来小指とかで叩くべき所も違う指で叩いてるからタイピングが遅いんだろうか?
なんでか関数の引数一覧が更新されないんだけど 何を削除するといいんだっけ?
.ncb
助かったdd
>>788 何をいってる?
首筋のバイオチップにUSBつないでるからタイピングなんかしない。
むしろPC側のノイズがフィードバックしてノイズが聞こえるのが気になる。
冗談はさておき、おれはいわゆるホームポジションも知らずに慣れてしまったから
オレはオレ流なんだけど、それはそれでいいと思ってる。
例えば右手をマウスに移動する予定のあるポジションと、
そうでない場合とで違うんだ。無意識なんだけど。
おれにはそれが最適になっちまった。
連続する大文字を楽に打つ方法教えろ
俺は _ が打ちにくいんだがw
>>793 正式なホームポジションって、微妙にプログラマには向かないのかもな。
オレ流は、まあ普通だが左手の薬指か小指でSHIFT押しながらうつよ。
右手はT、G、Bあたりまで攻め入る。
いま調べたが、%とかは左でSHIFT、右手で5を押してるな。
これはね、emacsでreplaceするとき、
左手だけでSHIFT+ALT+5に無理があるからそうなったんだと思う。
やべー、無意識って怖い。
>>794 右にもSHIFTあるだろw
/と隣同士じゃねーか。
それとも英語圏のKBDかい?
右手の小指で右Shift押しながら薬指でバックスラッシュって難しくね?
それが正式なうちかたなのかい? おれは右SHIFTを薬指で、_を中指で、ほぼ同時打ちしてる。 たぶん、右手が正式な打ち方より臨機応変なんだな。
Caps Lockしか有りませんがそれで代用できるのでしょうか?
ただ日本語配列だと、どういうわけか Shift を押しながらじゃないと CapsLock 効かないんだよな。 たぶん、暴発を防ぐための要らんお世話なんだとは思うが、 普通に使う人にとってはクソ仕様この上ない。 US 配列なら普通に押すだけで切り替えできるんだが。
おれにはCapsLockが無い。レジストリでcrtlに変えてしまった。 万が一、ものすごく長い大文字シンボルをうつときは、 小文字でうっちゃって後でemacsでupperにすると思う。 ホームポジションってマウスも無いワープロ時代の産物でしょ? 自分なりに臨機応変に工夫するしかないとおもうよ。
>>803 へえ、知らんかった。Shift押しながらの切り替えだから面倒くさくて
代用だってさ(笑( 何の略なのかすらも知らなかったんだろうね。
88とか98の時代は押すだけで切り替わってたような記憶が
CapsLockを押したときどうするとか、 そういうのは全てOSがコントロールしてる。 ハードウェアの仕様じゃない。 CapsLockやNumLockのLEDのコントロールすらOS管理。 なので、OSによると思う。
>>807 当時のは1キー分だけ離れてたんじゃなかったか?
[Caps][Ctrl][A][S][D][F]
みたいに。
ようするに自分が打ちやすいように打てば良いということでおk
>>808 そんなことはみんな知ってるし聞いてない。
812 :
デフォルトの名無しさん :2010/10/23(土) 01:33:45
え?設定で変えられるじゃん
>>812 そんなことはみんな知ってるし聞いてない。
荒れそうな予感 そんな荒れる要素あったか?w
>>814 「訊いてない」の方だろ?
FEPありなのに漢字もロクに書けないおまえの意見は訊いてない。いちばんね。
817 :
デフォルトの名無しさん :2010/10/23(土) 01:45:22
聞でいいんだよカス
↑馬鹿
聞でいいんだよカス
>>819 そんなことはみんな知ってるし聞いてない。
きかないか?
822 :
デフォルトの名無しさん :2010/10/23(土) 01:52:16
さっさとスレタイ直せよw
>>822 そんなことはみんな知ってるし聞いてない。
何とくだらない論争にw
そんなことはみんな知ってるし聞いてない! これ、流行るの?
>>826 そんなことはみんな知らないし聞いてない
828 :
デフォルトの名無しさん :2010/10/23(土) 01:59:11
829 :
デフォルトの名無しさん :2010/10/23(土) 02:00:27
831 :
デフォルトの名無しさん :2010/10/23(土) 02:12:14
↑馬鹿
>>832 そんなことはみんな知ってるし聞いてない。
834 :
デフォルトの名無しさん :2010/10/23(土) 02:24:09
>>834 そんなことはみんな知ってるし聞いてない。
なんなんだこの流れ
嵐がやむのを待つんだ!
838 :
デフォルトの名無しさん :2010/10/23(土) 03:05:11
まーだだよっ!
840 :
711 :2010/10/23(土) 10:20:38
>>717 ので自己解決しました
typedefについてあまり理解してないでしばらく
>>717 でいきます
842 :
711 :2010/10/23(土) 10:49:41
なんか自己解決ってのは変なんで言い直します
>>717 さんので解決しました。
答えてくださった方ありがとうございました
何度も書いてすいません
>>788 2chでタッチタイプできるって言ってる連中の9割以上は我流タッチタイプだろうな。
コーディングスタイルすら我流なんだからどうでもいいよ
845 :
デフォルトの名無しさん :2010/10/23(土) 12:19:27
846 :
デフォルトの名無しさん :2010/10/23(土) 12:23:11
足も使え
薬指ってあんまり使わないよね
なるほどキーを打った後ホームポジションに戻さない方が良いのか
打ったら戻る、真ん中へ!打ったら戻る、真ん中へ!
ちょっとワロタw
C言語でカプセル化はできないのですか?
我流タッチタイプだからホームポジションに戻すとかしないな あとでホームポジション教わってキーにポッチがついてるのに感動したっけ 薬指は普通に使うけど親指と小指はスペースとかEnterとか周辺キー専用になってるな あれ、ここなんのスレだっけ
>>852 できる。
FILE構造体と fopen(), fclose(), その他 f*() 関数群を真似る
Win32API もそうなってるな。
>>855 一旦呼び出してサイズを手に入れてから、それをもとに領域確保して、あらためて本番の呼び出しを行う、
という作法は非常に剛健というか用心深いというか、そこまで徹底してるのには感服した。
一般人じゃない人には普通のことでしょ
おらさっさと質問来いよグズども。 いつまで待たせんだべらんめい。
それならenumの便利な活用例をあげてくれ
enumって自分の場合、ほとんど使わんな。
enumは使うだろjk
まずはenumを皆がなんて読んでいるかだ 僕はイーナム(^q^)
エヌューンマッ
コード見る時とかコンパイル時にエラー出たら分かりやすい
CあがりとかVB6あがりのPGってenum使わないやつ多いな。
867 :
デフォルトの名無しさん :2010/10/23(土) 18:38:45
FILE * この意味ってどういう意味? なんで米印がついてるの?
>>867 stdio.h に定義されている構造体 FILE へのポインタ、という意味。
int *a; char *b ; と一緒 上記の意味もわからないようなら出直してきてください
870 :
デフォルトの名無しさん :2010/10/23(土) 18:45:09
void do_one(FILE *); void cant(char *); ↑みたいな最後の米印の意味おしえて
871 :
デフォルトの名無しさん :2010/10/23(土) 18:47:29
あありがと 早いね
void do_one(FILE *fp); void cant(char *c); と一緒 プロトタイプ宣言の仮引数はあっても無くてもいい
>>872 無いとき、悲しくなることがあるけどね…
qsrot(void*, size_t, size_t, int (*)(const void *, const void *));
要素数と1要素のサイズ どっちが先だー? って
# 仮引数名が実際の動作とは違う命名のトラップは論外として
874 :
デフォルトの名無しさん :2010/10/23(土) 18:58:52
ちなみにvoid do_one(FILE *); のdo_oneというのはprintfと 同じでそのまま出力されるんですか?戻り値なしで
なん……だと……?
877 :
デフォルトの名無しさん :2010/10/23(土) 19:25:44
>>874 です
つまりdo_one()の意味をわかりやすく教えてほしいです
どこの馬の骨が作ったか分からない関数が中で何をしているかなんぞ知るか
main(int argc, char **argv) ↑これはなんで*が二個もあるんですか
アナルが2個ってこと
>>878 すいません したの方に定義されてました
*argv[]ってこと
えっとつまり**argvとやると *argv[0] *argv[1] *argv[2] ....... こんな感じに考えていいですか
別に配列とは限らないんじゃ? 変数のアドレスがポインタ(*) 変数のアドレスが格納されてるアドレスがダブルポインタ(**)
質問を読み直してこいよ愚図
そんな限定条件で回答してたら絶対質問者は誤解すると思うけどな
>>884 うむ。
argv[0], argv[1]にはそれぞれアドレスが入っておる
関数に引数経由でポインタ返してもらおうとしたらポインタのポインタにするとか良く分からん。 そらint型のときはint型のポインタ渡すけどさ〜
こういうのダブルアナル使わないとうまくいかないじゃん。 #include <stdio.h> void set_str(char* str) { str = (char*)malloc(100); strcpy(str, "abc"); } int main(int argc, char **argv) { char* str = NULL; set_str(str); printf("%s\n", str); return 0; }
配列の添字演算子ってなんで二つ書き方があるんですか? array[0]と0[array]のどちらでもarrayの0番目の要素にアクセスできますが、 これってどんな風に使い分けるんですか?
>>890 mallocするならそれを返せよ、で終わるだろその例は
>>891 0[array]は見た目がよくないな
[array]0にしなさい
>>891 x[i]は(*((x)+(i)))と等価と決められているから
嫌がらせ目的以外では使い分けるな
arrayの型次第でしょ
B言語の関連でそうなったって本で読んだよ B言語は型がワードしかなくてアドレスがワード単位だったからってことで。
規格なんか知らなくてもいいのでは?
>>873 の
Xsort(void*, size_t, size_t, int (*)(const void *, const void *));
の実装はどんな感じなるんですか?
Xをq(急),b(泡),s(選)等にする時にするとき、ソートアルゴリズムも渡したいとき
はどうするんですか
array[0]が無難そうなんですね。 使い分けせずにこっちだけを使っていくことにします。 ありがとうございました。
array[]だろ
array[3]と3[array]だったら前者の方が分かりやすい。だから後者は使ってはいけない。
>>901 かなり無駄だが
typedef int (*SortCmpFunc)(const void*, const void*);
typedef void (*SortImplementFunc)(void*, size_t, size_t, SotCmpFunc);
void Xsort(void *array, size_t num, size_t size, SortCmpFunc cmpFn, SortImplementFunc impFn)
{
(*impFn)(array, num, size, cmpFn);
}
main(int argc, char **argv) { FILE *fp; --argc; /* argv[0]の分だけ減らす*/ ++argv; /* argv[0]を読み飛ばす*/ if (argc == 0) /* パラメータ無し */ do_one(stdin);/*標準入力を処理*/ else{ while (argc--){ if ((fp = fopen(*argv,"r")) == NULL) cant(*argv); do_one(fp); fclose(fp); argv++; } } return (0); } fclose(fp); argv++; } } return (0); } 上のwhile (argc--){ はどういう条件なんですか
未処理のコマンドライン引数があるなら
つか、ここで1問1答でやるよりどっか入門サイト見ながら順にやってけよ
>>908 !=0を補って読んでくれ
while (argc-- != 0) {
どういう決まりだから
なぜって while 文とはそういうものだからです 規格にもそう書いてある > An iteration statement causes a statement called the loop body to be executed repeatedly > until the controlling expression compares equal to 0.
if も while もゼロかどうかで判定する決まりだから。 printf("%d\n", ( 1==1 )); printf("%d\n", ( 1==2 )); これやってみれば解る。
>>908 !=0を補って読んでくれ
while (argc-- != 0) {
!=にする意味がわかりません
elseではifの反対の条件をだせるんですか
「馬鹿が釣られやがってw」とニヤニヤしながら書き込んでいる池沼の姿が俺には見える
しねばいいのに
>>916 もともと while は「式の値が 0 以外のあいだ繰り返す」文です
!= 0 というのはあなたが読みやすいようにわざわざわかりやすくしているだけです
付けようが付けまいが while 文の意味は最初から変わっていません
while (argc){ if ((fp = fopen(*argv,"r")) == NULL) cant(*argv); do_one(fp); fclose(fp); argv++; argc--; }
--argc; /* argv[0]の分だけ減らす*/ ++argv; /* argv[0]を読み飛ばす*/ if (argc == 0) /* パラメータ無し */ do_one(stdin);/*標準入力を処理*/ else{ while (argc--){ if ((fp = fopen(*argv,"r")) == NULL) cant(*argv); do_one(fp); fclose(fp); argv++; } } return (0); } 上whileが偽の場合だとどこの行に飛ぶんですか
え、
教科書読めよ
入門以前...
925 :
デフォルトの名無しさん :2010/10/24(日) 00:37:03
入門以前ってなんだ?
向かない?
門前払い
対応する括弧すら探せないとか文字が読めないに等しいレベル
929 :
デフォルトの名無しさん :2010/10/24(日) 00:40:35
エディタ変えろ
{}←これのせいでわからない基本真の場合次の文を実行、偽の場合その また次の文を実行するんじゃないの?
?
{ } 全体で1個の文だと数えればおっけー
>>932 だとしたら
>>921 の場合
{
if ((fp = fopen(*argv,"r")) == NULL)
cant(*argv);
do_one(fp);
fclose(fp);
argv++;
}
このひとまとまりが一文になるんですか
はい
意味がわからない
ifの場合とwhileの場合の条件式の次の複文は
if(条件){複文、真のとき実行
}
じゃないですか それなのに
>>921 のwhile複文は
{
if ((fp = fopen(*argv,"r")) == NULL)
cant(*argv);
do_one(fp);
fclose(fp);
argv++;
}
こんなに長いです 偽のときどこに行くのかわからないです
くぱぁ
なぜ短いと意味がわかって長いと意味がわからないんだ 単に長さが違うだけで同じことではないのか
お前ら本当に優しいな
ifの場合だと最初の{}は真の文ですよね if(条件){複文、真のとき実行 }←こんなふうになります{}の後にくるのは 偽の文です 上の場合whileの文は{}の次に}がきているのでわからないんですよ 教科書みても ないんです
そいつは else{ の終わりだ
いったん認識をリセットして0からやり直してほしい
>>939 cant(*argv); ここにくるのですか
じゃあifとwhileの複文は用途が違うということですね!?
用途っつうか複文は単に複数の文を1個の文にまとめるだけで、それ以上でも以下でもない
if文とwhile文を使った小規模なプログラムを自分で書いて動作を確認すれば分かるだろ
それもそうか 皆さんの熱意に感動しました それじゃあ おやすみ
ソースの参考例が悪いんじゃねぇの? 誰かもっと簡単なソース頼んだw
if (argc == 0){ do_one(stdin); } else{ while (argc--){ if ((fp = fopen(*argv,"r")) == NULL){ cant(*argv); } do_one(fp); fclose(fp); argv++; } // while文を閉じる } // elseを閉じる return (0); }
printf ( "10秒前\n" ) ; while ( count ){ count-- ; printf ( "%d\n", count ) ; } printf ( "発射!!!!\n" ) ;
952 :
デフォルトの名無しさん :2010/10/24(日) 02:44:33
--argc; /* argv[0]の分だけ減らす*/ ++argv; /* argv[0]を読み飛ばす*/ if (argc == 0) /* パラメータ無し */ do_one(stdin);/*標準入力を処理*/ else{ while (argc--){ ←ここの行のargcは前の--argcを if ((fp = fopen(*argv,"r")) == NULL) 引き継いでいるのですか? cant(*argv); その場合-2されて、argc[1]の場合なら do_one(fp); 個数0になりcantしてしまうのですが fclose(fp); argv++; } } return (0); }
argc-- と --argc の違いはわかってるかな while (argc--) { は while (argc != 0) { argc -= 1; と同じだよ
同じじゃねーよ馬鹿
>>952 argcが先に評価された後に-1されるんだよ。
956 :
デフォルトの名無しさん :2010/10/24(日) 03:02:12
今のコンパイラなら同じじゃないのか?
957 :
デフォルトの名無しさん :2010/10/24(日) 03:03:26
argc-- と --argc の違いがわからないです どっちも-1になるが代入の仕方が変わってくるそうですが この文では=はありません
i++と++iは違います。i++は、プログラムがその行を実行した後に1増加させます。++iは、プログラムがその行を実行する前に1増加させます。デクリメント演算子も同様です。
959 :
デフォルトの名無しさん :2010/10/24(日) 03:08:43
>>955 なるほど
つまり評価された後-1されてそれを繰り返して0になるわけですね
argv++;は配列のことを言っているのですか?
はい
厳密にはポインタ演算だよね?
962 :
デフォルトの名無しさん :2010/10/24(日) 03:15:52
大体見えてきました。 夜遅くまで感謝 またわからないことあったらききにきます
963 :
次スレ :2010/10/24(日) 03:32:28
このスレってミスに対して過剰に厳しくないか?
言葉で覚えようとすると先は長そう。一生かかるかも
次スレ立てます
#include <stdio.h> #include <stdlib.h> int main(int, char **); void sub1(); void sub2(); void sub3(); int main(int argc, char **argv){ sub1(); printf("main\n"); sub2(); return(EXIT_SUCCESS); } void sub1(){ sub3(); printf("sub1 containing sub3\n"); return; } void sub2(){ printf("sub2\n"); return; } void sub3(){ return; }
>>970 これの
int main(int, char **);
void sub1();
void sub2();
void sub3();
↑ ここの部分はなぜ必要なのですか?
また、
int main(int argc, char **argv)
↑の引数の意味が分からないので教えてください
> ↑ ここの部分はなぜ必要なのですか? 書かなくてもいいかも
>↑の引数の意味が分からないので教えてください return(EXIT_SUCCESS);
#include <stdio.h> #include <stdlib.h> int main (int argc, char **argv) { puts ("Hello, world.") ; return EXIT_SUCCESS ; } これ、何やってるんですか、教えてください。っていてるようなもん
#include <stdio.h> #include <stdlib.h> int main (int argc, char **argv) { puts ("Hello, world.") ; return EXIT_SUCCESS ; } これ、何やってるんですか、教えてください。
977 :
デフォルトの名無しさん :2010/10/24(日) 12:54:29
最近はご教授、ご教示どっちでもよくなったんかな
同じと思ったことを書けばいいのに
980 :
デフォルトの名無しさん :2010/10/24(日) 13:09:43
64*64=128ビットの演算をしたいのですが、C言語で計算すると 正しい結果が得られません。CPU自体は計算可能なのでアセンブラならできる らしいのですがなぜC言語だと出来ないのですか。
CPUは?
>>980 128bitの型のあるコンパイラなの?
構造体配列を使い、三人分の名前・年齢・性別を入力させて
三人分の名前・年齢・性別を出力するプログラムを作ったのですがよくわからないので教えてください
http://codepad.org/2rkZc0oQ 11,12行目のvoid〜とあるのですがvoid型は値を返すことができないと聞いたのですが普通に動作しました
あと構造体配列を関数に渡すやり方?がよくわかってないので
例えば関数として呼び出すときにinputf(data[])、かぎかっこをつけるとコンパイルが通らなくなります
なのにvoid〜とする場合にはなぜ[]をつけなければいけないのかよくわかっていません
どなたか助けてください・・・
984 :
デフォルトの名無しさん :2010/10/24(日) 13:18:28
セレロンT1600です。OSはVista32ビット、環境はCygwin GCC4.3.4を使っています。計算するためには何が必要か教えてください。 現状では計算ができないのであれば、具体的な対応策(PCやOSを変えるなど) を教えてください。よろしくお願いします。
具体的な対応策って > アセンブラならできる って、自分で言ってるじゃん
986 :
デフォルトの名無しさん :2010/10/24(日) 13:25:15
アセンブラはよくらないのでC言語で実装したいのですが、出来ない理由 が知りたいです。128ビットの型があるかどうかわh
987 :
デフォルトの名無しさん :2010/10/24(日) 13:31:04
今使っているコンパイラに128ビット型があるかどうかは分かりません。
gccなら128ビットの型を作れるみたいだけど 演算まで面倒は見れくれないと思う ま、代替え関数でもあれば、アセンブラ使わないですむけど、俺はしらん 具体的にやりたいこと書いてgccスレで聞いた方がいいかも
>>983 http://ideone.com/aLq6H >void型は値を返すことが
何も返してないし何か問題でも
>[]
仮引数の配列は全てポインタとして扱われる
void outputf(value data[]);
void outputf(value *data);
は同一
>呼び出すときにinputf(data[])
配列はポインタへの暗黙変換があるので
inputf(data);
は
inputf(&data[0]);
として扱われる
>>980 お使いのコンパイラでは int 型 が 64ビットとか128ビットになっていないせいかもしれません。
コンパイラがなにか教えてください。
991 :
デフォルトの名無しさん :2010/10/24(日) 13:45:49
CygwinのGCC4.3.4です。
992 :
デフォルトの名無しさん :2010/10/24(日) 13:49:35
mingw32もインストールしてあります。
993 :
デフォルトの名無しさん :2010/10/24(日) 13:56:30
コンパイラの見分け方がわかりません>128ビット対応
994 :
デフォルトの名無しさん :2010/10/24(日) 13:56:49
001.txtから150.txtまでのテキストファイルを任意のフォルダに作成する方法を教えてください
cmd.exe起動して copy 001.txt 適当なフォルダ 以下略
なんか怖いプログラムだな
64bit*64bit=128bitをやりたいって 8bit*8bit=16bitはかけ算使わないでCで書いたことあるんかね
998 :
デフォルトの名無しさん :2010/10/24(日) 14:27:40
そんな方法あるんですか?
結果128bitの人がやりたいことって基本的にbit数が違うだけでしょ Cで書きたいっていってるから inline asmだと違うやり方になるけど、かけ算して結果128bitになる命令があるなら
暗号馬鹿といい変なのがよく来るようになったな
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。