スレタイ間違った。
終了…
頼むからスレ立てフォームに目立つように「タイトルに#を入れるな」と書いてくれ。
どうして#が無視されるんだろう…
クソスレage
まだC#厨の
>>1か。
「C#最強伝説」とか馬鹿な名前のスレたておって「C#最凶伝説」だろヴォケが
みんな悪かった…
半角#が無視されることを知らなかった…
2で終了かよ
>>10 ごめん。本とは♯を入れるべきだったんだが、さすがにこのスレタイでは使えない(誰がどう見てもCのスレに見える)
12 :
デフォルトの名無しさん:03/11/10 21:36
前の2スレの913に対する指数関数の計算。誰か答えてやれよ!
こういうのをマクローリン展開っていうんだ。覚えておけ
/* poly.c */
#include <stdio.h>
#define N (4)
main()
{
floatt, n, x, y, z;
intfact, i, j;
y=0
fact = 1
t=1
for(j = 0; j <= 7; j=j+1){
t=t*x;
for(i = 1; i<= 8; ++i){
fact = fact * i;
y=y+ t/fact;
}
}
}
>>12 >intfact, i, j;
しかしこれはさすがに通らない。
>floatt, n, x, y, z;
ついでにこれもな。
tabが落ちただけだろ
>>16 それ以前にここはC#スレ(の残骸)です。
プログラミングが芸術って言うけどソースをAAにするつわものはいないか?
>プログラミングが芸術
その考え、捨てた方が安全。
>>19 そうします・・・
もう少しいい物が作れるようになってから言うようにしますね
21 :
デフォルトの名無しさん:03/11/21 10:26
1は立て逃げ?
削除依頼ださないの?
[287] 名前: 飛べない削除屋 ★ [ sage ] 投稿日:03/10/18 16:30 ID:???
(引用前略)
>>286 スレタイを間違えたという理由では削除できませんです。
また、スレタイの変更はできません。
>>25 マジで?
じゃあ、ほっとこうか…
それとも再利用する?
くだ質でながされてしまいました。
画像や音声ファイルなどを実行ファイルに一まとめにしたいのですが、
どうすれば良いでしょうか?
C言語、gccですが、Makefileなどで何かすればよいのでしょうか?
リンクするとき*.oと一緒にリンクするのですかね?
すいません・・・・もぅ我慢できないっす・・・・
ぬるぽ
29 :
デフォルトの名無しさん:03/12/13 09:32
>>30 文字列処理や動的配列なんかの仕方なくポインタを使わざるを得なかった部分で
ポインタを使わなくてすむだけでもだいぶ楽ではあるんだろうけど
32 :
デフォルトの名無しさん:03/12/13 15:24
C言語統合スレですかここは。
なら質問します。
C言語でお勧めのコンパイラはなんですか?
gccはGNU Compiler Collectionで、GNU C Compilerだったのは昔の話。
>>36 でも、GNUなCのコンパイラに関してはGNU C Compilerと言う名が残っているよ。
彼はどこにもgccとは書いてないから耐えがたきを耐えて黙ってたんだ。俺は。
GNU Compiler is not C Compiler
Gcc is not C Compilerにすべきだったな
>>40 Collectionはどこに消えたんだ?
42 :
デフォルトの名無しさん:03/12/14 20:15
43 :
デフォルトの名無しさん:04/01/06 22:10
void*の使い方についてお聞きしたいのですが。
bsearchやqsortなどの関数で探したい値の型は何でも探せる
ようになってますが、その際にサイズとしてsize_t型を引数として
与えていますよね。
で、探したい値や探す配列はvoid*型の引数として
受け取っているので、size_tで受け取った型にキャストしないと使えない
と思うんですよ。
その時size_t型でバイト数はわかるけれども実際にint型なのかlong型
なのかって判らないと思うのですが、どんなふうにしてキャストしてるんでしょうか?
知っている方が居ればご指導下さい。よろしくお願いします。
>>43 bsearchやqsortはポインタの指す中身にはまったく関知しない。
そのために比較関数を渡すようになってる。
47 :
デフォルトの名無しさん:04/01/17 23:45
ファイルが更新されたというのをCのプログラムへ渡せますか?
ディレクトリ内を延々と読み込んで判定するというようなのではなく、
「更新された」という情報をトリガにして読みにいきたいんです。
>>47 FindFirstChangeNotification
49 :
デフォルトの名無しさん:04/01/18 00:40
>>48 標準の関数ですか?<FindFirstChangeNotification
Win32標準。
>>52 ふーん、俺の Windows2000 では kernel32.dll にあるみたいなんだけど、君のは違うんだな。
SDKにあるね。FindFirstChangeNotification。
MSDN参照。おしまい。
C++で質問なんですが
2行3列の行列の和を求める関数 int sum(int x[][3],int y[][3],int z[][3])
で仮引数x[][3]をx[][]と出来ないのは何故ですか?
また、この関数だとn行3列の行列の和しか出せないのですが
n行m列の行列の和を出す関数は作れないんでしょうか?
>>55 >で仮引数x[][3]をx[][]と出来ないのは何故ですか?
サイズのわからない型を要素とした配列は定義できないからです。
サイズがわからないと、添え字によるアクセスができないので。
>n行m列の行列の和を出す関数は作れないんでしょうか?
作れます。
「作れます。」ではあまりに不親切ですね…
一例を書いておきます。
int sum(int *x, const int *y, const int *z, int n, int m)
{
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
x[i * m + j] = y[i * m + j] + z[i * m + j];
return 0;
}
>56さんありがとうございます。
これで次章に進めます。
59 :
デフォルトの名無しさん:04/02/16 18:32
文字列を数値に変換してそれをint型の変数に入れたいのですが
例えば
char buf[] = "23456";
int num;
こんな形だった場合、numに数値の23456を入れるにはどのようにするんでしょうか?
bufに入るのは数字のみです。
よろしくお願いします(´・ω・`)
atoi
sage忘れ&宿題スレと間違いました。。。すいません
首吊って逝ってきます(´・ω・`)
西成広告
■ ソフトの総合商社 そふとはうす ■
Windows日本語製品版です。Macもあります。 単位はすべて円です
Office 2003 Pro 10,000
WindowsXP Pro 4,000
Windows2000 Pro 4,000
Windows2003 ServerEnterprise 15,000
FrontPage 2003 4,000
OneNote 2003 4,000
Acrobat 6.0 Pro 7,000
AfterEffects 6.0 Pro 15,000
CreativeSuite Premium 20,000
Premiere Pro 10,000
DreamweaverMX 2004 5,000
FlashMX 2004 5,000
FireworksMX 2004 5,000
StudioMX2004 with FlashPro 10,000
LightWave3D 7.5 10,000
Shade6 Pro 10,000
AutoCAD 2004 20,000
AutoCAD LT 2004 12,000
VectorWorks Ver10.5 10,000
RenderWorks Ver10.5 10,000
3DStudioMAX 6J 10,000
NortonSystemWorks 2004 Pro 3,000
NortonInternetSecurity 2004 Pro 3,000
Painter8 5,000
すべてユーザー登録できません。windows日本語製品版です。
ご注文はここ→ chuumon@jumpy.it
63 :
デフォルトの名無しさん:04/02/19 12:25
デジタルマーズってどうやってつかうのでつか?
コンパイルはできまつたが、リンクでおちまつ。
Lineage2, ResonanceAge等の3Dゲームのマクロ or BOTをCで作りたいのですが知識が無くて製作できません
お勧めの書籍やツール等あったら教えてもらえないでしょうか?
資金はバイトで貯めた5万円です、BOTを作るにあたってアドバイスなど頂けたら嬉しいです
65 :
デフォルトの名無しさん:04/02/20 18:35
age忘れました
66 :
デフォルトの名無しさん:04/02/20 18:55
質問でふ。
コンパイルして作られる実行ファイルのアイコンを
Windowsのデフォルトのアイコンでなくて別のビットマップに
したい時はどうしたらよいでしょう?
ググったけどわからなかった・・
Windowsでしたらリソースでググって下さい。
>>67 なんかわかったっぽいです。
心から礼を言いたい。
列挙型で質問なんですが
enum menu{ add, kill };
menu selemenu(void)
{
int a;
return (menu(a));
}
int main(void)
{
menu b;
switch( b = selemenu() )
{
略
}
return 0;
}
私が参考にしている本では上記のように
selemenu関数の返却値a(menu型)をmain関数でb(menu型)に代入しています。
しかし、bがint型でもa(menu型)が代入できてしまいます。
なぜですか?
>>69 互換性があるからです。ポインタと配列のようなものです。
まだポインタまで勉強してないんですが
配列の要素一つ一つに型が設定できるとか言う話と関係するんですか?
レスありがとうございます。
enum型は int の値に名前を付けて、その集合を定義していると考えればいい。
通常は0から順に値が自動的に当てはめられるが、
enum menu{ add = 10, kill = 20 };
みたいに値を指定することもできる。
あまり詳しいことを言うと混乱するかもしれないので言わないが、
列挙体型の値は int 型へ明示的なキャストなしで変換される。
それは仕様。
で、逆に int 値から列挙体型へは明示的にキャストしないといけない。
>>71 > 配列の要素一つ一つに型が設定できるとか言う話と関係するんですか?
意味不明。
C++で質問なんですが
typedefがなんなのかが良くわかりません。
staticやautoは解かるんですが・・・
>>75 ある型に別の名前を付ける予約語です。
Cの時代は構造体のstructが省けなかったのでそれの除去などによく使われていました。
C++だと、名前空間とかクラステンプレートの指定を省略するのによく使われている。
名前空間はエイリアスが作れるが。
namespace A = B::C::D;
>>78 >>77が言っているのは
typedef std::string string;
のような話じゃないか?
クラス内では名前空間に対するusingができないから
有効なこともあるかと。
std::stringの実体ってびろーんと長いテンプレートの具体化なんでしょ?
ポインタについて質問です
int* a;
a = &b;
この場合aがポインタ?
ポインタだとすると&bの名前は何でしょうか?
それともint* a; a = &b; 二つでポインタ?
>>82 ポインタは「型」について言うときと「変数」について言うときがある。
int* a; /* aは「intへのポインタ」型の変数。単に、aはintへのポインタであるとも言う。 */
a = &b; /* &bは「intへのポインタ」型の式。型が同じなのでaに代入できる。 */
>83
即レスありがとうございます。
>>83 アドレスとポインタは違うものだと思うぞ。
関数へのポインタに関して質問です
double型の引数を受け取って、double型を返却する関数へのポインタfuncを
double (*func)(double x)
と宣言するそうなんですが
int* a = &bとオブジェクトへのポインタを宣言するなら、関数へのポインタの宣言は
double* func(double x)
になるんじゃないでしょうか?
>>86 int ???;
は、"???の型がintである。"と読むといい。
int *a;
なら、*aの型がint、
double (*func)(double);
なら、(*func)(0.0)の型がdouble
double *func(double);
なら、*func(0.0)の型がdouble
>87
int* a = &bとint *a = &bは同じ宣言なんですか?
>double (*func)(double);
なら、(*func)(0.0)の型がdouble
double *func(double);
なら、*func(0.0)の型がdouble
*funcに()のある無しで何か違いはあるんでしょうか?
関数ポインタと普通のをごっちゃにするなよ
ごっちゃにしてたみたいです;
double *func();とするとdouble型へのポインタを返すfunc関数
double (*func)();とすると整数を返す関数へのポインタfunc
ってことでしょうか?
double *func();とするとdouble型へのポインタを返すfunc関数
は番地を受けとってなにか処理をして番地を渡す関数になるんでしょうか?
ごっちゃになってるのは君の頭だ。と言ってみる。
>>87 > int* a = &bとint *a = &bは同じ宣言なんですか?
同じ。
> *funcに()のある無しで何か違いはあるんでしょうか?
ポインタなら変数だから中身を入れ替えられる。
逆に普通の関数は定数だとでも思って。
>>90 > double *func();とするとdouble型へのポインタを返すfunc関数
> double (*func)();とすると整数を返す関数へのポインタfunc
doubleを返す関数へのポインタ、ね。
> double *func();とするとdouble型へのポインタを返すfunc関数
> は番地を受けとってなにか処理をして番地を渡す関数になるんでしょうか?
意味不明。引数にアドレスを取るような宣言には見えない。
番地を渡すというのが返すという意味なら、そこは正しい。
なるほど
レスありがとうございました。
93 :
デフォルトの名無しさん:04/03/17 23:10
素朴な疑問なんだけどfloorって関数があるじゃない。
実数xに対してxを超えない最大の整数を返すやつ。
例:floor(5.3)=5 floor(-1.5)=-2
で、これってなんで戻り値が実数になってるの?
double floor(double x)
じゃなくて
int floor(double x)
のほうが自然だと思うのだけど。
何か理由があるんですか?
int(double x)
のほうがもっと自然だな
>>93 intの範囲を越えた場合どうしましょう?
96 :
デフォルトの名無しさん:04/03/17 23:25
Web用のCのCGIで、<form>から受け取ったデータの解釈はどうやればいいのでしょうか?
環境変数を得るまではできたのですが・・・
GETとPOST両方教えてください。
Perlはそこそこできますが、Cは初心者です
>98
既に見ました。
C++じゃなくてCでありませんか?
>100
読んでもさっぱりです。
そういえばCって仮想配列むりなんですよね
103 :
プログラムだめぽ:04/03/23 20:46
しょぼい質問で悪いのですが(´・ω・`)
下のifとelseifの部分で何も実行しないように
作りたいのですが、エラーがでてしまいます
どうすれば解決します?
void remove_dead_path(struct survival_path *root){
if(root->upper!=NULL)remove_dead_path(root->upper);
if(root->lower!=NULL)remove_dead_path(root->lower);
if(root==leaf[0]) ←ここから
else if(root==leaf[1])
else if(root==leaf[2])
else if(root==leaf[3]) ←ここまでなにも実行したくない
else free(root);
}
>>103 if(root==leaf[0]) ←ここから
;
else if(root==leaf[1])
;
else if(root==leaf[2])
;
else if(root==leaf[3]) ←ここまでなにも実行したくない
;
else free(root);
105 :
プログラムだめぽ:04/03/23 20:55
>>104 セミコロンつけるだけでよかったのか
ありがとう~助かった。・゚・(ノД`)・゚・。
107 :
デフォルトの名無しさん:04/03/29 15:21
あほなのはむしろ
>>106であるという趣旨の書き込み
108 :
デフォルトの名無しさん:04/04/10 13:58
むしろくそスレほどageる価値があるという趣旨の書き込み
109 :
デフォルトの名無しさん:04/04/30 21:09
現在勉強中のC初心者です。
独習Cの次に読むとよさげな本を教えてください。
独習Cが終わっても、まだそんなこと言ってるのか。
111 :
デフォルトの名無しさん:04/04/30 21:52
猫でも分かるWindowsプログラミング、でもやってみれば?
113 :
デフォルトの名無しさん:04/04/30 21:57
あ、Windowsプログラミング、興味ありました!
そうか、そういけばいいのですね。
すみません、ご親切にありがとうございます!!!
独習Cの次は初めてのCだ。
間違いない。
分からないときは、
作ってわかるCプログラミング。
分かったら、CCレモンを飲む。
間違いない。
質問です。
キーボードの入力をscanfとかじゃなくて押された瞬間処理をする関数ってないですか?
HSPのstick見たいな奴・・・
>>116 <conio.h>があれば、その中のgetche
>117
具体的な使い方がワカリマセン
(´・ω・`)ヘルプで命令が見つからない・・・
∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´∀`)/ < 先生!やっぱ無限ループですね!
__ / / / \________
\ ⊂ノ ̄ ̄ ̄ ̄ ̄\
||\ \
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄||
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
.|| ||
>>116 それは、windowsアプリにしたほうが楽。
キーボードが打たれたときだけ反応して
打たれてなかったらそのままプログラムを進める。
打たれたキーによって処理をさせる。(Iが押されたら~とか)
そのやり方がワカリマセン
getcheだと打たれるまでとまるので・・・
教えてクレクレ厨でスマソ 吊ってきまつΛ||Λ
# include <conio.h>
int c;
if(kbhit()) /* キーが押下されている */
c = getch();
else
/* 何か別のことをする */;
if(kbhit())のkbhitは何なんでしょうか・・・?
あとiが押されたらiが押されたと分かるようにするにはどうしたら・・・?(´・ω・`)
>>123 kbhitはキーボードのキーが押されているかを判定する関数。
iが押されたらgetch()から'i'が返る。
if(kbhit() && getch() == 'i') /* 今iが押されている */
>124
おお とてもわかりやすいです。
アリが㌧。ニューソクで47氏逮捕祭りか・・・
また迷惑かけに来ました。
if(kbhit()&&getch()=='a'){printf("a");}else if(kbhit()&&getch()=='b'){printf("b");}
上のようにするとキーボードの処理が遅くなります。どうしたら?
kbhitとgetchを複数回使わなければ良いのでは?
>127
それ以外のやり方しらないんで・・・
// なにをしたいのか知らないが、これで参考になるだろ。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define END_CODE '\n'
const char *EndCodeName = "Enter";
int dispatch(int event){
switch(event){
case END_CODE:
printf("プログラムを終了します。");
exit(0);
default:
printf("[0x%02x] が押された。\n", event);
}
return 0;
}
main(){
int prev,cur;
printf(" ********************\nキーコード表示。\n[%s]で終了します。\n********************\n", EndCodeName);
for(;;){
if(!kbhit()) continue;
if(prev != (cur = getch())){
dispatch(cur);
prev = cur;
}
}
}
>129
ありがとうございます。
とても参考になりました。
C言語で、JPEG画像ファイルを表示させようとした場合、どんなコントロールがありますか?
VBだったら、ピクチャーボックスなるものがあるけど、Cで扱えるコントロールにはどんなのがありますか。
当然ウィンドウ上で表示させるということです。
132 :
デフォルトの名無しさん:04/05/12 21:41
すいません、初歩的な質問なのですが
char型の変数って何バイトまで値を格納できますか?
ファイルから読んだ値を格納したいのですが、どの程度の大きさまで可能なのか分かりません
char自身は1バイト。
配列ならば・・・・・・自分で試してみろ。
char 2ch[10000000] // About 10M byte
とか。エラーが出たら駄目ー。出なかったらOK-
エラトステネスの篩を作ろうと思ったんですが、
配列の個数を1000000000000(1兆)個にしようとすると
うまくコンパイルできません。
配列の数をメモリの許す限り使いたい場合はどうしたらよいのですか?
とりあえず、配列の数が1兆個あれば問題ないんです。
135 :
デフォルトの名無しさん:04/05/12 22:53
>>134 1TByte以上のメモリを積んでください。
1.0005TByteくらいのメモリであれば問題無いと思います。
>>135 そんなの無理です。
計算してみたら私の言っていることが
いかに無理難題だったかがわかりました。
配列の数をなるべく多くするにはどうしたらいいのですか?
メモリの許す限り配列を並べる方法はありますか?
137 :
デフォルトの名無しさん:04/05/13 00:40
mallocとかでは駄目なのかい?
size_tが32bitだと無理
>>136 Windows2000(XP)だったら2GBが限界だよ。64bitのOSに乗り換えて1TB以上の
ディスクアレイを組んでやるしかない。
「配列の個数」ではなく「配列のサイズ」だろ
配列のサイズの上限は言語処理系のマニュアルに書いてあるはず
#メモリ上に乗らないデータを扱うというのは大昔からあるテーマだな
[10000][10000]で一億をやってみたいと思います。
[10000]だったら
9592個の素数を入れれましたので
配列じゃなくてリストを使ってみたらどうだろう?
動的にメモリを確保していくので可能な限り最大の値まで求められるし、
非素数と判明したノードはすぐに開放 or 再利用できるから、無駄も少ないだろ。
「エラトステネスのふるい」では無いかもしれないが。
143 :
デフォルトの名無しさん:04/05/13 20:20
あぁ、そんなことしなくてもいいじゃん。
動的に確保して、配列満杯になったら、全てファイルに書き出し。
んでまたそれ以上の数字について調べる。
これだったら、[10000]くらいでいいじゃん。
ただし処理が多少遅くなる可能性もあるけど。
これだったら、パソコンが扱える最大の数字まで、計算できるじゃん。
ファイルをセーブして、そのファイルに変数を保存しておく方法(int型など)は無いですか?
講座などを見てもchar型くらいしかのってないので。
char型から整数を取り出すしかないですかね?
fread&fwrite
fscanf&fprintfでもいい。
う~ん fprintfとfscanfを使っても保存できるんですが
保存した変数の取り出し方がワカリマセン。ちゃんと保存できているのかも怪しいです。
データ形式は自分で責任持ってください。
ポインタへのポインタはどうやるんですか?
すいません、どなたもいらっしゃらないようなので
あげますね
>>152 sosuu[1]に何も値を代入してないから。
> sosuu[n+1] = sosuukouho;
と
> m += 1;
の間に
printf("n = %d, m = %d, sosuu[%d] = %d\n", n, m, n+1, sosuu[n+1]);
を入れて確認してみ
>>153さんわかりました。
if((sosuukouho % sosuu[n] != 0) && (n == m)) の部分の
(n==m)ここが原因だったんですね
(n==m-1)としたら直りました。
ここが影響したので
printf("素数の数は%d個で、最後の素数は%dです。\n",m,sosuu[m]); を
printf("素数の数は%d個で、最後の素数は%dです。\n",m,sosuu[m-1]);
になおして無事意図したとおりに動くようになりました。
ありがとうございました。
155 :
デフォルトの名無しさん:04/05/20 21:33
なーんでこのすれは閑古鳥がないてんだよう
>>155 それは、このスレの存在自体が「間違い」だから。
正しくはスレタイをミスっただけなんだが、そのミスが致命的なミスだったわけで・・・。
んじゃ、お気に入りから削除しますね
二次元配列のポインタの宣言しかたがわかりません
char a[2][2],*ptr,*ptr2
ここから自分なりに考えてもコンパイルエラーになります。
>>158 char (*pa22c)[2][2]; /* 2次元配列へのポインタ */
char *a22pc[2][2]; /* ポインタの2次元配列 */
またまたポインタの質問です
*(pointa + (指定一次元添字 * 二次元要素数) + 指定二次元添字) 某C講座から
上の指定一次元添字と二次元要素数というのはどういう意味なんでしょうか?
指定一次元添字が指定する一次元の配列番号なんですか?
日本語おかしいです。スミマセン
type array[N][M];
type *p = array;
array[4][12] = *(p + 4 * N + 12);
>>161 pointa[N * M]; /* pointa[N][M]; みたいに使う */
/* ... */
a = pointa[i * M + j]; /* a = pointa[i][j]の代わり */
なので、
i : 指定一次元添字
j : 指定二次元添字
M : 二次元要素数
と思われます。
M+jとするのはなぜなんでしょうか?
>>164 M + jじゃなくて
(i * M)そこに + j している感じで
#include <stdio.h>
#include <conio.h>
int main()
{
int *ptr;
int a[2][2],b;
*ptr = a;
a[1][2]=5;
b=*ptr[1*2+1];
printf("%d",b);
getch();
}
アァ・・・
まちがえて送信してしまった・・・
166のソースがコンパイルできません
int ( *)[2]型はint型に変換できない
無効な間接参照
の二つです。
*p: int型
a: int(*)[2]型
b: int型
*p[1*2+1]: int*型
*p[1*2+1]はおかしい。
これは*(p[1*2+1])と解釈され、p[1*2+1]の型はintだから、*を適用できない。
無効な間接参照とはこのことだろう。
*p[1*2+1]はおかしい。
これは*(p[1*2+1])と解釈され、p[1*2+1]の型はintだから*を適用できない。
無効な間接参照とはこのことだろう。
>168
ptr=(int *)a;
としてなかったのが原因ですか。
ptr=(int *)a;
*ptr[1*2+1]=70 とやると失敗します。
*(ptr + (1*2)+1)=70とすると動くんですが・・・。
あと*(ptr + (1*2) + 1)とするとptrに(1*2)+1を足してますがptrはどんどん増えていかないのでしょうか?
>168
ptr=(int *)a;
としてなかったのが原因ですか。
ptr=(int *)a;
*ptr[1*2+1]=70 とやると失敗します。
*(ptr + (1*2)+1)=70とすると動くんですが・・・。
あと*(ptr + (1*2) + 1)とするとptrに(1*2)+1を足してますがptrはどんどん増えていかないのでしょうか?
>168
ptr=(int *)a;
としてなかったのが原因ですか。
ptr=(int *)a;
*ptr[1*2+1]=70 とやると失敗します。
*(ptr + (1*2)+1)=70とすると動くんですが・・・。
あと*(ptr + (1*2) + 1)とするとptrに(1*2)+1を足してますがptrはどんどん増えていかないのでしょうか?
>>166 のソースを正しくとこうなるんだよね
(便宜上aは初期化させてくれ)
#include <stdio.h>
#include <conio.h>
int main()
{
int (*ptr)[2], a[2][2] = {{0, 1}, {2, 3}},b;
ptr = a;
a[1][2]=5;
b=ptr[1][1];
printf("%d",b);
getch();
}
なんか3回も書き込んである・・・orz
>>174 おお ありがとうございます。
(*ptr)[2]は*ptrの変数配列ですか?
ptr[1][1]と*(ptr+(1*2)+1)ではどっちの方が処理早いですかね?
>>175 >(*ptr)[2]は*ptrの変数配列ですか?
>>159参照。
ptrはint[2]へのポインタ。
>ptr[1][1]と*(ptr+(1*2)+1)ではどっちの方が処理早いですかね?
この二つは全く意味が違う。
後者はptr[3]と同じで、型はintの配列。
>>160が理解していないと思われることを補足しておく。
必要がなかったらスルーしてくれ。
まず、二次元配列は、配列の配列である。つまり、
int arr[2][3];
という宣言があるとき、arr[0]やarr[1]はintの配列で、要素数は3である。
ここで、配列はその先頭要素へのポインタに変換されることを思い出して欲しい。
だから、arrはarr[0]へのポインタに変換される。arr[0]はintの配列だから、
変換された後のarrはintの配列へのポインタ、つまり型はint (*)[3]である。
int (*)[3]型の変数pを宣言するにはint (*p)[3];と書く。これが、
>>174で
ptr = a;
が正しくコンパイルされる理由だ。
次に、配列の要素を指しているポインタに整数nを足すと、
はじめに指していた要素のn個先の要素を指すポインタができる。
これは、その配列が、配列への配列(二次元配列)であっても同じことである。
だから、
>>174の例で*(ptr+(1*2)+1)と書くと、ptrの三番目の要素が得られる。
実際にはptrには二つの要素しかないから、この結果は意味を成さない。
最後に、配列はメモリ上で、各要素が隙間なく並べられる。たとえば、
int arr[2][3];
と宣言した場合、arr[0]とarr[1]が隙間なく並べられる。
このとき、arr[0]やarr[1]も配列だから、これらの各要素も隙間なく並べられる。結果的に、
arr[0][0] arr[0][1] arr[0][2] arr[1][0] arr[1][1] arr[1][2]
と並ぶことになる。
この並びを一次元配列とみなしてアクセスするのが、
>>161の方法である。
このとき、一次元配列の各要素はintであることに注意してくれ。
これを実現するには、添え字を一次元配列用に計算してarr[0][0]へのポインタに足せば良い。
arrはarr[0]へのポインタであってarr[0][0]へのポインタではないから、そのままでは使えない。
そこで、素直に&arr[0][0]と書くか、(int *)arrと強引にキャストする。
#include <stdio.h>
#include <conio.h>
int main()
{
int *p, a[2][2] = {{0, 1}, {2, 3}},b;
p = &a[0][0]; /* p = (int *)a;と書いても同じ */
a[1][1] = 5; /* a[1][2]は配列の外 */
b = *(p + (1*2+1)); /* b = p[1*2+1]; と書いても同じ */
printf("%d",b);
getch();
}
>>160がやりたかったのはこれかな?
>177-179
おお 分かりやすい説明ありがとうございます。
p=&arr[0][0]の方法は2次元以上の配列だと楽ですね。
181 :
デフォルトの名無しさん:04/06/09 15:05
調べても分からなかったんで教えてください。
イーサネット接続するときに connect()を使うわけですが
これのタイムアウト値を設定したいときどうすればよいのでしょうか。
settimeoutとか見かけたけど使い方が分かりませんでした。
182 :
デフォルトの名無しさん:04/06/29 16:56
連立方程式を解くプログラムを教えて下さい~!
ax+by+c=0
dx+ey+f=0
のときx,yをとくような奴です。
C言語でおながいいいい
>>182 代数・幾何学の勉強しなさい。逆行列を作れば簡単に解ける。
理系の大学生なら授業でやると思われ。
初めまして。色々と試しているのですが、プログラムが作れません。
よろしければ、教えてください。
「チーム研究発表会の評価を集計するプログラムを作る。3人以内の学生メンバーで構成される4
チームが発表会に参加する。評価は調査内容、提案内容、発表資料、発表方法の4つのポイントで
行われ、各々のチームに対して合計点数が付けられる。」
1.評価に必要なデータを全て含むようなチームを表す構造体を作成し、typedefで名前を付けよ。
変数名はできる限り理解しやすいものを考え、各チームのメンバーのフルネームと学籍番号も
分かるようにすること。また、各チームにはチーム番号をつけよ。
という物なのですが、ここまで指定されていたら作れるのが当たりまえなのかもしれませんが、初心者
なものでほぼ手につきません。よろしければ、ヒント的なものでもかまわないので教えてください。
>>185 ありがとうございます。そちらの方で聞いてみます。
質問です.
循環リストの長所と短所と、どのようなアプリケーションに
循環リストは向いているかを教えてください。
188 :
デフォルトの名無しさん:04/10/09 22:28:31
すみません。
C言語 dos で
msecの時間を表示したいのですが、
どのようにすればよいでしょうか?
よろしくお願いします。
189 :
デフォルトの名無しさん:04/10/09 23:07:53
>>1 > いろんなスレが乱立していますが、
お前が言うことではないな。
C/C++ でフリーのライブラリとかでperl相当の正規表現処理
とかテキスト処理とかしてくれるようなものって存在しませんか?
あるいはperlのスクリプトをそのまま使えるような・・・
フリーで無ければ有料でも構いませんが。
age忘れました
紹介thx.
194 :
デフォルトの名無しさん:04/11/09 21:13:39
LSI C-86 超簡単セットアップの
Setlsic.batを実行したんですが
LSI C-86試食版をF:\LSIC86にセットアップします。
と表示されてドライブを指定できません。
何ででしょうか?
>>194 そのSetlsic.batとやらを直接書き換えてみたらどうだ?
196 :
デフォルトの名無しさん:04/11/11 15:25:53
今Cのコンパイラしかないプラットフォームで開発をしていまして、
もともとC++で書いていたコードを移植しています。
クラスになっている箇所は、C++のクラスみたいに、
struct AbstractClass{
int (*funcA)(void);
int (*funcB)(void);
int (*funcC)(void);
};
struct ConcreteClass{
struct AbstractClass _super;
};
という風に仮想関数テーブルみたいなものを作ってるんですが、
struct ConcreteClass c;
struct AbstractClass *abstract;
abstract = (struct AbstractClass*)c;
abstract->funcA(abstract);
とかいちいち先頭に呼び出しのオブジェクトを入れたりするのが面倒だったり、
構造体のメンバのスコープを限定できなかったり、と色々不便です。
C++みたいなシンタクス(仮想関数テーブルとか構造体のメンバのスコープの限定とか)で書けて、
普通のC言語のコードを吐き出してくれるパーサーとかないでしょうか?
以前、昔のC++コンパイラは一旦Cのコードに変換してからコンパイルしていた、と読んだのですが、
今でもそのようなものはありますでしょうか?
197 :
デフォルトの名無しさん:04/11/11 18:02:27
今Cのコンパイラしかないプラットフォームで開発をしていまして、
もともとC++で書いていたコードを移植しています。
クラスになっている箇所は、C++のクラスみたいに、
struct AbstractClass{
int (*funcA)(void);
int (*funcB)(void);
int (*funcC)(void);
};
struct ConcreteClass{
struct AbstractClass _super;
};
という風に仮想関数テーブルみたいなものを作ってるんですが、
struct ConcreteClass c;
struct AbstractClass *abstract;
abstract = (struct AbstractClass*)c;
abstract->funcA(abstract);
とかいちいち先頭に呼び出しのオブジェクトを入れたりするのが面倒だったり、
構造体のメンバのスコープを限定できなかったり、と色々不便です。
C++みたいなシンタクス(仮想関数テーブルとか構造体のメンバのスコープの限定とか)で書けて、
普通のC言語のコードを吐き出してくれるパーサーとかないでしょうか?
以前、昔のC++コンパイラは一旦Cのコードに変換してからコンパイルしていた、と読んだのですが、
今でもそのようなものはありますでしょうか?
C++の方のオプションで出来たような希ガス
>>198 gccのman見たけど見つからなかった。
どのコンパイラで使えるかご存知でしたら教えていただけませんか?
>>199 一部機能が使えない(関数のオーバーロードとか)くらいなら問題ないんですが、
プリプロセスの結果が怪しい、ってことでしょうか?
>>197 >普通のC言語のコードを吐き出してくれるパーサーとかないでしょうか?
普通、そういうのは「パーサー」と呼ばず「トランスレータ」と呼ぶ。
後は自分で調べれ。
gccの環境ってどこでDLすればいいんでしょうか?
ググッたけれど見つからないので(´・ω・`)
Windowsです。
そろそろLinuxに移行しようと思ってるのでLinuxも教えていただければ幸いです。
>>204 WindowsならCygwinをインストールするときにgccを指定できるし、
MinGWというフリー環境もある。
Linuxだと大抵のディストリビューションに付属しているので特に問題はないと思う。
debianなどのディストリビューションでは初めから入っているわけではないが、
apt-getなどのツールで一発でインストールできる場合がほとんどなので、
Linuxの場合は開発環境に悩まされる事はほとんどないと思うよ。
>>205 即レスありがとうございます。
Cygwinを入れたときに指定していなかったらしいのでMinGWを使ってみます。
>>206 もう一度Cygwinのセットアッププログラムを実行して、gccを指定すれば
そのままインストールできるけれど。
再インストールではなく追加インストールになる。
>>207 MinWinでどれをDLしてよいかわからなかったのでCygwinのほうでやってみます。
とりあえずパッケージ選択時に全部選択しました。疲れたorz
Cygwinはデフォルトでgcc3.3.3だから、3.4入れたければ設定替えないとね
>>201 ありがとうございまつ。
探したけどもう全然ないんですね(´・ω・`)
>>210 Objective-Cならトランスレーターがあるが・・・
プログラマさんからみて、unixのソースコードってどうなんでしょう?
インターフェース関係ぐらいしか読んでないのでわかりませんが、
やっぱりプロはすごい。
213 :
デフォルトの名無しさん:04/11/12 21:39:10
#include <stdio.h>
main ()
{
int res;
char ans;
printf("何番目を選びますか?\n");
printf("整数を入力してください。\n");
scanf("%d",&res);
if(res == 1)
ans = 'A';
else
ans = 'B';
printf("%cコースを選択しました。\n",res);
return 0;
}
って本に書いてたんでコンパイルしようとしたら
ansに代入した値は使われていない。
と表示されてコンパイルできません。
なんででしょうか?
printf("%cコースを選択しました。\n",res);
↓
printf("%cコースを選択しました。\n",ans);
>>214 ありがとうございます。
できました。
これで先に進めます。
216 :
215:04/11/12 22:31:43
すいません。
次のsampleもできません。
内容は
#include <stdio.h>
main ()
[
int res;
char ans;
printf("何番目を選びますか?\n");
printf("整数を入力してください。\n");
scanf("%d",&res);
ans = (res==1) ? 'A' : 'B';
printf("%cコースを選択しました。\n",ans);
return 0;
}
というのものですがどこが変なんでしょうか?
>>216 main()の直後の [ を { へ。
218 :
216:04/11/12 23:05:27
>>217 コンパイルできました。
こんな質問にも答えてくれてありがとうございます。
目の前にあるバグが見えるか見えないかは経験の問題だからな
①for(i=0;i<5;i++)
②for(i=0;<=5;i++)
①は0,1,2,3,4と5回
②は0,1,2,3,4,5と6回繰り返す
という意味合いでいいんですか?
222 :
デフォルトの名無しさん:04/11/16 22:03:19
あげさせてもらいますよ
②は違う
226 :
デフォルトの名無しさん:04/11/16 22:09:27
いまくだらんプログラム作っていまして、ビルドしたらエラーが12・・・orz
何回も見直したんですが、原因が見いだせなくて・・・
初歩ですが、どうかよろしくお願いいたします。
/*shm.c*/
#include<stdio.h>
#include<conio.h>
int main(void){
int age;
int seito;
printf("▼はENTERを押してください。\nまた、INPUT[というのが出た場合は、整数値を入力してENTERを押してください\n");
printf("A:ちょっと聞きたいことがあるんだよ。いいかな?.....▼\n");
getch();
printf("A:一応、自分刑事で、極秘の捜査中でね。秘密だよ。お願いがあるんだけど年齢教えてくれないかな?▼\n");
getch();
printf("俺の年齢は......INPUT[");
scanf("%d", &age);
printf("俺の年齢は%dです。", age);
printf("A:ありがとう。%d歳なんだね。ところでMONEY IS LIFEという学校をしているかい?捜査中で必要な情報なんでね。知らないか?▼\n",age);
getch();
printf("自分がその学校の生徒ということを教える.....YES=1 NO=0.....INPUT[");
scanf("%d", &seito);
if(age >= 15){
printf("A:ありがとう。君は好青年だね。ところでお金をくれないか?あぁ?残念だったな。いろいろ教えてくれてありがとうよ。あとは金奪ってサヨナラだ。( ゚Д゚)イッテヨシ!▼\n");
}else if(seito == 1){
printf("A:ありがとう。君は好青年だね。ところでお金をくれないか?あぁ?残念だったな。いろいろ教えてくれてありがとうよ。あとは金奪ってサヨナラだ。( ゚Д゚)イッテヨシ!▼\n");
}else{
printf("A:いろいろ教えてくれてありがとう。じゃぁマタね。▼\n");
}
getch();
printf("こういう奴には気をつけよう▼!\n");
getch();
printf("おわり。▼\n");
return 0;
}
228 :
221:04/11/16 22:15:36
ほかのスレで聞いてきます
カワイソウナショウネン…
230 :
デフォルトの名無しさん:04/11/17 00:39:05
233 :
デフォルトの名無しさん:04/11/18 00:45:36
goto文って飛べるの関数内だけだけでしたっけ?
その場合にかなり深い位置にある関数内からmainのある位置に戻すいい方法ってありますか?
235 :
デフォルトの名無しさん:04/11/18 00:55:09
>>233 gotoは関数内のみ。 もっと飛ぶならlongjmp。
>>233 setjmp と longjmp でいけます。
237 :
233:04/11/18 01:20:14
>>226 はスルーなのか・・・
「人工無能」でぐぐってくれ
getch();
再確認。
こ こ は ス レ タ イ ト ル を ミ ス っ た C ♯ ス レ で す にょ
241 :
デフォルトの名無しさん:04/11/22 15:01:17
UnixとWindows両方で使えるCのZip操作ライブラリが欲しいんですが、どんなのがありますか?
zipという単語が一般的過ぎてぐぐってもノイズばかり…
重複スレ
= = = = = = = = = = = 終 了 = = = = = = = = = = =
244 :
デフォルトの名無しさん:05/01/03 17:58:01
じゃあ本スレってどこ?
>>242 zlibでいいんじゃないの? Windows端末でもCygwin使えば使えるし。
とりあえずexeファイル作りたいんですが
どうすればいいんですか。
>247
解決
>>248 ありがとうございます。
それを使ってみます。
250 :
デフォルトの名無しさん:05/02/03 00:21:32
マルチメディアタイマを使って、8Hz(125ms周期)にある関数を起動させたいのですが、
方法(できればコード)を教えて下さい。
while(1){foo();sleep(125);}
>>251 煽りはいいけど、マルチメディアタイマ使ってないですね。
254 :
デフォルトの名無しさん:05/02/03 06:23:35
1次元配列と2次元配列でたとえば
int a[6],b[2][3]を確保して
a[0]とb[0][0]、a[1]とb[0][1]、a[2]とb[0][2]、
a[3]とb[1][0]、a[4]とb[1][1]、a[5]とb[1][2]が
それぞれ同じアドレスを参照してa[0]を変えたらb[0][0]も一緒に中身が変わるようにしたいんだけど
#include <stdio.h>
void main(void)
{
int *a[2];
int b[6];
a[0]=&b[0];
a[1]=&b[3];
}
って書き方でいいかな?
なんか問題ある気がするんだけど他にいい方法ないかな?
あとポインタにするのは2次元配列のほうにしてほしいのよ
255 :
254:05/02/03 06:30:01
ここC#スレだったのか
スレ違いスマソ
他スレ行ってきます
256 :
デフォルトの名無しさん:05/02/03 14:03:04
【質問】 VC++でdouble型の数字を小数点以下を切り捨ててCString型に変換するにはどうすればいいか?
CString strAAA;
double dBBB;
dBBB = (double)50.0;
strAAA.Format(_T("%f"), dBBB);
とすると、strAAAには"50.00000"
という文字列が入りますが、
strAAAには"50"という文字列を入れたいのです。
どうすればいいのでしょうか?
258 :
デフォルトの名無しさん:05/02/03 14:17:48
>>257 サンクス。
MSDNライブラリで
%d や %f
に関する説明ページが見つからなかったもので。
>>258 探し方が悪い。
CString::Format()の説明からリンクを二回手繰れば書いてある。
っていうか、それ以前に、幼児期の直感教育がしっかりなされていない。
書式がprintfと同じではないかとどうして想像できなかったんだろう。
想像していたら%gを試していたはずだ。
知らなかったとしてもprintfの書式で調べていたはずだ。
261 :
デフォルトの名無しさん:05/02/03 16:18:18
【追加質問】 double型の数字を7桁にすると ***e+006となってしまうのを、7桁の文字列にしたい。
CString strAAA;
CString strBBB;
double dCCC;
double dDDD;
dCCC = (double)1234567;
dDDD = (double)123456;
strAAA.Format(_T("%g"), dCCC);
strBBB.Format(_T("%g"), dDDD);
とするとstrAAAには"123456"という文字列が入りますが
strBBBには"1.23457e+006"という文字列が入ってしまいます。
strBBBに"1234567"という文字列を入れたい場合はどうすればいいのでしょうか?
最高10桁までちゃんと入るようにしたいんです。
多倍長浮動小数点演算ライブラリ使えよ
10桁までなら%.10g
265 :
デフォルトの名無しさん:05/02/03 16:49:45
266 :
デフォルトの名無しさん:05/02/03 16:50:59
違うよ。
つーか、260,263,264は私じゃない。
270 :
デフォルトの名無しさん:05/02/03 20:03:35
271 :
デフォルトの名無しさん:05/02/03 20:09:55
あれ・・・?空白欄がない。
メモ帳で見るとあるんです。
ネタかなあ・・
ヒント:全角スペース
>>270 もしかすると、君は全角スペースを入れているのでないだろうか。
使っても良いのは半角スペースとアルファベット、半角の記号のみ。
ま、全角スペースを解釈しないコンパイラが悪いんだな。
うんうん。
それは言えてる。
276 :
デフォルトの名無しさん:05/02/03 20:34:03
ありがとうございました
要は空欄を空けてもいいけど、半角を使えと言う事でしょうか?
だめだこいつ
全然わかってない・・
278 :
デフォルトの名無しさん:05/02/03 20:40:51
すみません・・・
簡単に言えば、空欄(スペース)は空けない方がいいですよね?
279 :
デフォルトの名無しさん:05/02/03 20:43:28
ブラウン運動を非整数階微積分するプログラムを作成したのですが、上手く動きません。どこがわるいのでしょうか??
実行結果は数値を出し、エクセルでグラフ化しています。(window.hが使えないため)
#include <stdio.h> #include <stdlib.h>
#include <time.h> #include <math.h>
#define KMAX 100 #define XMAX 300
#define PI 3.14159265358979323846
double gar()
{double r = 0.0;
int i;
for(i = 0; i < 10; i++){r += ((double)rand() / RAND_MAX) - 0.5;}
return r;}
int main(void)
{int x, k; float d; scanf("%f",&d);
double ek = PI * 2.0 * 0.7 / XMAX; double a = 5.0 – 2*d;
double f[XMAX]; double g[KMAX];
srand((unsigned)time(NULL));
for(k = 1; k < KMAX; k++){
g[k]=pow(( ek * rk ),-a/2);}
for(x = 0; x < XMAX; x++){ f[x] = 0.0;
for(k = 1; k < KMAX; k++){ double kx = ek * rk * x;
f[x] = f[x]+g[k]*(gar() * cos(kx) - gai() * sin(kx));}
printf("%g\n",f[x]);}
}
>>278 先頭に付けてもいいのは半角スペースとTABのみ。
スペースを空けるのは括弧同士の対応や意味的な違いを付けるためで、それをインデント
を付けるといいます。
これをしないとプログラムが見憎くなります。
的確にスペースを空けてください。
281 :
デフォルトの名無しさん:05/02/03 20:54:30
>>280 ありがとうございます!!
とりあえず、半角でスペースを空けたら、何の問題もなく
実行できました。
たぶん、全角だったのでエラー出たみたいでした。
282 :
ななし:05/02/03 22:14:53
どなたかC言語でHTTPリクエストを送信できるようなライブラリを
ご存知のかたいらっしゃいませんか?
ヘッダーを意識しなくてすむような形のもので!
WinInet
質問です。
以下の環境で、外部バイナリ(画像)ファイルを実行ファイルにリンクしたいのです。
何かスマートな方法はあるのでしょうか?
開発環境OS : FreeBSD 5.3
コンパイラ : gcc 2.95.4
調べたこと :
binutils の objcopy でオブジェクトファイルに変換n出来るかなと
ドキュメントを流し読みしましたが、出来そうにありません。
以上、よろしくお願いします。
285 :
デフォルトの名無しさん:05/02/09 12:50:59
Labeling.c1: "#include" expect "FILENAME"or<FILENAME>
このエラーを回避する方法わかる方いますか?よろしくお願いします
286 :
285:05/02/09 13:00:42
すみません。なんか初歩的入力ミス見たいです
287 :
デフォルトの名無しさん:05/02/09 13:14:18
ウインドウズプログラミングで仮想キーコードを使って
数字を表示したいのですが、0が表示できません。
keybd_event(VK_NUMPAD0,0,0,0);
keybd_event(VK_NUMPAD0, 0, KEYEVENTF_KEYUP, 0);
文法的に誤りがあるのでしょうか?
わかる方いましたら、お願いします。
288 :
デフォルトの名無しさん:05/02/09 13:36:43
誰かFTPサーバのソースプログラム教えてくれない?
今すぐ欲しいから誰かお願いします。Cの初心者なんで、そ
んなの簡単だよって思うかもしれませんが、どうかC言語
できる人よろしくお願いします。
Linuxのソースがあるべ、バカだな
おい!そいつは初心者だぞ。Linuxのソースの見れる方法も
ついでに教えてやれ。たぶんわかっとらんと思うぞ。
おっしゃるとおりです・・・。教えていただけます?
嫌だね、プ
RFC FTPでぐぐれば仕様書が出てくるからそれで作るのもいいかも
>>287 VK_NUMPAD0の代わりに'0'にしてみたらどう?
あのー・・・いまいちよくわかりません・・・。どなたかサンプルプログラム
書けるひといます?もしよかったらここに表示していただけたらと思い
ます。それをそのまま打ち込んでいくんで・・・。
ポート20をリッスン、認証できたら、ポート20のコマンドどうりに
ポート21でデータ転送。以上
私はCommonArchiverProjectのftp.dllを参考にしたことがあるなぁ。
バグがあって笑えたけど。
わらってはいけない。只で提供してるんだから。
金取ってるやつには罵詈雑言OK
いやぁ、使ってる人いないんだろうなぁと。<笑えた
尤も、作者に指摘メール送ったが黙殺されたので、本当のところは知らん。
300 :
デフォルトの名無しさん:05/02/09 17:03:27
#include <stdio.h>
void main(void)
{
int i;
char a[5];
for(i = 0; i < 5; i++){
printf("何か1文字入力する\n");
scanf("%c",&a[i]);
}
printf("%c,%c,%c,%c,%c\n",a[1],a[2],a[3],a[4],a[5]);
}
非常に簡単な質問で申し訳ないのですが…
このプログラムを実行するとforのi=2,i=4のときのscanfが飛ばされてしまいます。
その後の結果表示も何かおかしいのです。
自分なりに調べてはみましたが、一体何が悪いのかがわかりません。
コンパイラはBorland C++ Compiler 5.5を使っています。
改行コードもsacanfだな
302 :
デフォルトの名無しさん:05/02/09 17:37:54
void main(void)
{
int i;
char a[5]; // ←範囲は、0~4までで 5個
char b[1024];
for(i = 0; i < 5; i++){
printf("何か1文字入力する\n");
scanf("%s",&b); // バッファーフォローの危険性があり、実務だと駄目!
a[i] = b[0];
}
printf("%c,%c,%c,%c,%c\n",a[0],a[1],a[2],a[3],a[4]);
}
こんな感じだけど、入力は別関数を作ってね!
ださ
>>302 突っ込みどころ満載だな。
・バッファオーバフローの心配するなら指定子で制限しろ。
・配列のアドレスを渡すな。
・バッファーフォローなんて俺語を作るな。
・main()の戻り値を勝手にvoidにするな。
>>300 最後のprintfところでa[1]~a[5]になってるとこをa[0]~a[4]になおして、
それから一回目の入力で入れたい数字を全部連続でいれてみ?2468って感じで
最後の出力だけはきれいにでるとおもうよw
306 :
デフォルトの名無しさん:05/02/09 21:05:07
>>304 で、模範解答は?
文字列の読み込みって、簡単なようで難しいんだよね。
scanf を使って・・・・
300です。
皆さんレスありがとうございます。
あれからも考えてみましたが、やっぱりわかりませんでした。
aの配列というのが不味いのかと思って、a,b,c,d,eと定義してみましたが、これもまた同じ結果になってしまいます。
もうあきらめた方がいいんでしょうか。
バグの原因がわからないと、また再発させそうで非常に気になるんですが…
scanf使うのが悪い
fgetsしてsscanf使え
>>300 まず1文字目を入力した後、Enterを打つだろ。
そのEnterもscanfの%cで入力されているのだろう。
と、俺は予想した。
#include <stdio.h>
int main(void)
{
int i;
char a[5];
for (i = 0; i < sizeof a; i++)
scanf("%c%*[^\n]%*c", &a[i]);
//%*[^\n]は'\n'が出るまで読み飛ばす指定
//%*cは1文字読み飛ばし('\n'まで読み飛ばしたので当然'\n'を読み飛ばす事になる)
printf("%c, %c, %c, %c, %c\n", a[0], a[1], a[2], a[3], a[4]);
return 0;
}
>>300 301さんが解答ですよ。
scanf("%c",&a[i]);
で一文字読み込んだとき、まだ標準入力のバッファには改行文字が残っているのです。
それが自動的に偶数回のscanf(...)の入力となっています。
scanf("%c",&a[i]);
fflush(stdin);
として標準入力のバッファをクリアしてあげれば、一文字ずつ入力できます。
>>310 fflushは出力バッファのフラッシュ用なんで残念!
stdinに対しては未定義り!
312 :
デフォルトの名無しさん:05/02/09 22:49:21
#include <stdio.h>
#include <stdlib.h>
int GetStdinToInt()
{
char buf[256];
int result;
char* check;
while(1){
fgets(buf, 255, stdin);
result = (int)strtol(buf, &check, 0);
if(check != buf) break;
printf("もう一度入力してください:");
}
return result;
}
315 :
302:05/02/09 23:02:16
>scanf("%s",&b);
scanf("%s",b); ←訂正すんまそ
最近、JavaとVBしかやってないから・・・・ (ーー
>>300 fflush(stdin)
のかわりに、
fseek(stdin, 0, SEEK_SET);
が動作保証されています。
でも、今回の場合は314で2番目のURLに書いてあることが一番いいかも。
失礼
fseek(stdin, 0L, SEEK_SET);
でした。
simpson法の中で関数を呼び出してその中で積分の計算を行うプログラムを作っています。
しかし、計算速度がものすごく遅いんですがなにかいい方法ありませんか?
で、今の計算機は?
>>320 thx
SSEつかって高速化図ってみます、、
C言語のバージョン教えてと言われた。
どうやって知ればいいんだろうか。
sにcharを足すstrcatってないの?
>>323 ありませんよ。
Cで一般的に言われる文字列というものは、最後がヌル文字'\0'で終わることを前提
としています。提供されるシステム関数strcat()などもそうです。
一文字のcharはそういった関数で使用することはできません。
char dest[100];
char src1[] = "abc";
char src2 = 'x';
int len;
len = strlen(strcpy(dest, src1));
dest[len] = src2;
dest[len + 1] = '\0';
こんな感じですかね。もっとアクロバット的な方法もあるんでしょうが...。
int n = c;
strcat(s, &n);
>>326 関数内の自動変数の場合、
int n
の場合、cを代入した次のバイトがNULLである保証はありませんよ。
補足。
CPUのアーキテクチャによって異なります。
言語としてそういったことに依存すべきではないと言いたかったのです。
>>327 ん? cは1バイトだから他の3バイトは当然0になるでしょう。 しかしこれは
endianによっては右に詰まってだめだと思うので
>>328は正しいと
思うけど。
ちなみにこんなのはどう?
sprintf(s, "%s%c", s, c);
>>329 未定義
>>326 char s2[] = {c, '\0'};
strcat(s, s2);でいいじゃん。
C99ならstrcat(s, (char []){c, '\0'});って書ける筈だけど。
私はこんな幹事かな。
sprintf(strchr(str, '\0'), "%c", ch);
或いはこう。
char * p = str + strlen(str);
p[0] = ch;
p[1] = '\0';
332 :
デフォルトの名無しさん:05/02/27 16:56:10
すみません、妙な質問で恐縮ですが、どなたか教えてください。
sprintf() の s ってどういう意味ですか?f は format の意味だと思うのですが。
stringじゃない?
sはsecond。fはfirst
string ですか。ありがとうございました。
scond ですか(ry
>>332 printf()「系」とかssanf()「系」とか言う言葉があるよ。
先頭の's'はstring、'f'は自分でオープンしたファイル、付かないものは対象がstdinか
stdout。結構系統立てられているんですよ。
メンゴです。
一行目のssanf()はscanf()でした。
>>336 さらにva_listを引数に取るvprintf/vscanfも有る。当然fとsも有る。
vscanf系はC99で追加されたものだけど。
springfというのもある
さらに最新最強はsnprintf。 渡したchar *のサイズを2つ目の引数で指定でき、
そのサイズを超えて書かないことが保障されているのでやや安全。
アドレスに関する質問。
型は不明で、要素一つのサイズは分かってる場合。
次の要素にアクセスする方法を教えて下さい。
または次の要素へのアドレスを取得する方法。
サイズがBYTEだってことに気づかなかった....。
解決しました。
POINT point[3] = { {0,0} , {1,0} , {0,1} };
っていう初期化はできるんですが
point[3] = { {0,0} , {1,0} , {0,1} }
という風に値を入れることが出来ません
配列全体に値を入れる方法は無いんですか?
>>343 配列に代入はできません。
精々コピー用の関数を用意するのが関の山です。
要素数が3で固定ならば、構造体にしてしまえば(直値ではありませんが)代入できなくもありません。
>344
関数でもつくってそれで入力するようにします
ありがとうございました。
Cって、こういうとこアフォだよなあ
やっぱりRubyがいいね
cでコンパイルする際に
windres: can't open `obj/EK-MAMEko/ui/mame32k.res' No such for directory
make: *** [obj/EK-MAMEko/ui/mame32.res] Error 1
こういうエラーが出て困ってるんだけど
これってどういう意味かわかる?
349 :
デフォルトの名無しさん:05/03/13 17:14:00
age
変数を入れ替えるときに別の変数を用意せず、
X = X ^ Y, Y = X ^ Y, X = X ^ Y;
とするのがよくないのはなぜ?
>>351 数値以外には使えない
XとYが同じ変数を指していると上手くいかない
>>352 なるほど。
これをプリプロッセスでやって構造体なんかを渡しちゃうとマズーだ。
アリガト。
new演算子で作ったオブジェクトをdeleteした後に
デストラクタでdeleteすると何か問題ありますか?
mallocで確保した領域をfreeで開放しますが、
システムはどのようにして、はじめに確保した領域を知ることができるのでしょうか。
>>354 deleteしたら、0を入れておけば大丈夫。
>>355 malloc()で戻されたポインタの指すメモリの直前辺りに管理情報を埋めておくのが一般的。
357 :
デフォルトの名無しさん:2005/04/03(日) 14:07:55
配列同士の数値の比較をしたいのですが、下記のようだとうまくいきません。
どのようにすればよいのでしょうか?
for(i=0;i<5;i++)
for(j=0; j<5; j++)
if(group[i] == group[j] && i != j) count[i]++;
>>357 配列の同じインデックスを持つ要素同士を比較したいのであれば、単純な(一重の)ループでいい。
つーか、>357では日本語の説明が足りんし、コードがおかしいし、何がしたいのか判らんのだが。
すみません。初歩的な質問をさせていただきます。
char *func1(){
return "a";
}
char *func2(){
char *s = "a";
return s;
}
こんな2つの関数があったとして、これらが関数の呼び出し元に返ってきた際に
戻り値のポインタが正しい場所を指し示すことはどこまで(いつまで)保障できるんでしょうか?
func1は保障できる、func2はできる、それとも両方できない/できる、どこまでなのか…等。
また、私の勉強不足のせいで、両者のメモリ上での違いがいまいちはっきりしてません。
一応どちらでも動作するにはするんですが、いつか不正な参照とかで
落ちちゃうんじゃないかと気になって怖くて夜も眠れません。
参考になるサイトを教えていただけるだけでも結構ですのでよろしくお願いします。
規格ではどうか忘れたけど、たいがいいけるはず。
どうしても心配ならstatic const char ret_str[] = "a";とかすれば?
あとchar *じゃなくてconst char *を使え。
>>360 定数(リテラル)の寿命はプログラムの開始から終了まで。
関数内で宣言されたauto変数の寿命は、関数の開始から終了まで。
char *func1(){
return "a"; /* "a" を指すポインタを返している */
}
char *func2(){
char *s = "a"; /* ポインタ s を "a" を指すポインタで初期化 */
return s; /* ポインタ s の値、つまり "a" を指すポインタを返している */
}
つまり、どっちも同じ。
リテラルはいつでもどこからでも参照出来るので、戻り値を使ってても大丈夫。
363 :
360:2005/04/04(月) 02:05:28
>>361-362 ありがとうございます!だいぶスッキリしました。
リテラルに関しては参照先が不正な値になるんじゃないかとかいう
心配は無用なわけですね。逆の場合(変数、関数のポインタ)は気をつけろと。
すみません。あとここからもう一段階お願いします。
実は言うと今、Unix系ソフトの移植作業をやってまして
こいつらと同等の動作をするものを作りました。
char *dirname(char *path);
char *basename(char *path);
basename()はパス名からディレクトリを除いた部分(ファイル名)を返せばいいので
引数のポインタをそのまま使い回してreturn path+pos;のようにして返してます。
dirname()の方は引数で与えられたパス名からファイル名を除いたものを返すものなので、
関数内でdir[MAX_PATH]のように宣言した配列に、引数の文字列からファイル名部分を
除いたものをstrncpyでコピーなどして、最後にdir(先頭アドレス)を戻り値にしてます。
(ちなみにさっきの質問は"."「カレントディレクトリ」を返す場合でした。)
長すぎるのでまとめると、
・basename()の戻り値は呼び出し先のローカル変数とは無関係である。
・dirname()の戻り値は呼び出し先のローカル変数に依存している。
この場合だと、dirで確保していたアドレスは戻り先で参照しても安全なのでしょうか?
ちゃんと動くし、自分でも大丈夫だと思ってたのに警告が出たので不安になりました。
やたら長くてすみません。何かこれより良い実装方法がもしあればご教授願います。
364 :
360:2005/04/04(月) 02:14:47
何度もすみません。つまりさっき私が言ったdirname()の実装は
char *func2(){
char *s = "a"; /* ポインタ s を "a" を指すポインタで初期化 */
return s; /* ポインタ s の値、つまり "a" を指すポインタを返している */
}
この場合と同じと考えていいんでしょうか?ってことですね。
私の目には全く同じものに映るのですが、間違いありませんでしょうか。
365 :
デフォルトの名無しさん:2005/04/04(月) 02:15:23
floatがもてる最大値はどのように調べればよいのでしょうか?
>>363-364 const char *func3(void){
const char s[] = "a";
return s; /* ローカルな配列 s へのポインタを返す */
}
const char *p;
p = func(); /* 0, func() の s へのポインタを受け取る */
printf("%p\n", p); /* 1, これは構わない */
printf("%s\n", p); /* 2, これは駄目 */
0 は何ら構わない。戻ってきたアドレスをコピーしているだけ。
1 も何ら構わない。コピーしたアドレスを表示しているだけ。
2 は駄目。アドレスの先を参照してしまっているから。
何故参照してはいけなかというと、アドレスの先にある func3() の s の寿命は、
func3() を抜けた時点で既に尽きてしまっているから。
func2(), func3() は全然違う関数。
>>365 float.h にある FLT_MAX マクロで定義されてる。
#include <stdio.h>
#include <float.h>
int main(void)
{
printf("%f\n", FLT_MAX);
return 0;
}
>364
ダメ。変数の寿命について学んでください。
1.関数の引数を変える。
void dirname(char *dest,int dest_size,const char *path)
2.静的に保持する。使用に若干注意が加わる
static char dir[]
3.動的に確保する。呼び出し側に解放義務が発生する
char *dir = malloc()
369 :
デフォルトの名無しさん:2005/04/04(月) 03:05:49
>>367 thx
limit.hしか知らなかった
370 :
360:2005/04/04(月) 03:13:01
そのまま貼っちゃいます。今はこんな状態です。
char* dirname(char* path)
{
int pos = strlen(path)-1;
int lastPathSepFoundPos = -1;
static dir[MAX_PATH]="";
while(pos >= 0) {
if (path[pos] == '/' || path[pos] == '\\') {
lastPathSepFoundPos = pos;
break;
}
else pos--;
}
if (lastPathSepFoundPos == -1) return "."; // current dir
else{
strncpy(dir,path,lastPathSepFoundPos);
dir[lastPathSepFoundPos] = 0;
return dir;
}
}
static dir[MAX_PATH]="";をchar dir[MAX_PATH]にすると
→警告「ローカル変数またはテンポラリのアドレスを返します」
となってました。今考えてみれば当然ですよね。。
>>368 どうもです。ちょうど昨日、その2を回避策としてやってみてたとこでした。
その注意というのは関数へのアクセスが同時に起こるような場合でしょうか?
条件コンパイル(#ifdef-#endif)等が面倒になりそうですが、
1の方法が一番簡単そうなので、その方向でやってみることにします。
↑static char dir[MAX_PATH]="";の間違いです。
strrchr 使えば簡単にみえるな・・・
すみません最近C++触ったばかしですみませんが
class auのコントラクタ関数
au(string s) : enr(s) {}について
文字列をsに代入し enrを生成する時にsを代入すると読めるのですが
なぜ au(string s) { enr(s); }とできないんですか?
個人的に関数内容 { }内 は動作命令のみの記述と解釈すれば
au(string s) { enr = s; }
はenr = s;という動作命令であるから適応であるが
{ enr(s); }・・・であるから不適と思ってしまうのですが・・
書いててよくわからなくなってきた・・
au (string s) : enr(s) {}について
なぜ : で区切るのかと enr(s)はなぜ{}内に記述してはいけないのかについて詳しくお願いします
>>373 :の後は初期化。{}の中だとメンバ変数への代入になってしまう。
例えば、
class foo {
const int bar;
foo() : bar(0) {}
};
とした場合、この例のように初期化はできるが、
class foo {
const int bar;
foo() {bar = 0;}
};
このような代入はできない。
>>374 全て解決できました。
どうもありがとです
共用体ってどういうときに使うんですか?
また利点とかあるんですか?
すみません。教えてください。
下記のようなプログラムを書くと、結果に必ず0.0が混ざってしまい、困っています。
乱数を3つ表示させたいのですが、0.0を含まないようにするにはどうしたらよいのでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define N 3
int main(void)
{ int i,j=0,check;
double data[N],dia[N],tmp;
srand((unsigned)time(NULL));
printf("\n乱数のつもり:\n");
for (i=1; i<=N; i++)
{data[i]=rand()%100+(double)rand()/32768.0;}
/* 並替えの計算 */
for (i = 1; i < N - 1; i++)
for (j = i + 1; j < N; j++)
if (data[j] < data[i]) /* <: 昇順, >: 降順 */
{ tmp = data[i];
data[i] = data[j];
data[j] = tmp;};
for (i = 0; i < N; i++)
printf("%.1f ", data[i]); /*並替えデータの表示*/
}
378 :
デフォルトの名無しさん:2005/04/20(水) 00:47:24
>>376 メモリの節約
同じメモリブロックを複数の型として解釈したい時
>>377 取り敢えず落ち着け。
深呼吸でもした後、data[] の添え字の範囲が
0~N-1 だと言うことを思い出せ。
>>376 通信などで、整数型や実数型をバイト列と相互変換したい場合、
ポートアクセスなどでビットフィールドとバイト列を相互変換したい場合などに使う。
メリットは、他の方法に較べて簡便に書けること。
デメリットとしてよく言われる非互換性については、元々汎用的でないコードを書く場合には無視できる。
#勿論、それ相応のコメントは必要。
382 :
デフォルトの名無しさん:2005/04/23(土) 00:09:57
C、C++ある程度覚えるまで、どのくらい掛かった?今から、勉強しようと思うのですが、C→C++→C#か、Javaって感じに逝こうかと思うのですが、C++から移行した人、する人は、C#か、Javaどっち盗ります?←煮たスレあるけどノリで…ゴメソ
無意味っていいよね。
まぁ答えてやんなよ。発想の無い、IT土方プログラマーの行く末までを……ハァー
なんでこう勉強する前にウダウダ人に聞くやつが多いんだろう
386 :
デフォルトの名無しさん:2005/04/23(土) 12:20:20
>何でこう勉強する前にウダウダ人にきく奴が、多いのだろう
って、自分も聞いてるじゃんWWW プギャー、と云ってみたくなる。まあ、オイラは聞かなかった、お陰でプログラマーなんかになってしまった訳だが…ハァー
ageんなやボケがあああああ、と自分に云ってみるテst
すまんです
388 :
デフォルトの名無しさん:2005/04/26(火) 11:13:11
∧_∧
( ´∀`) < ぬるぽ
389 :
デフォルトの名無しさん:2005/04/27(水) 10:54:11
1+2+3+・・・+N を計算する関数を作成せよ。
>>389 int f(int N){return((1+N)*N/2);}
391 :
デフォルトの名無しさん:2005/04/27(水) 11:57:21
1/2/3/・・・/N を計算する関数を作成せよ。
>>391 int f(int N){return0;}
393 :
デフォルトの名無しさん:2005/04/27(水) 12:45:24
>>391 double f(int N){double x=1.0;if(N>1)while(N)x*=(double)N--;return 1.0/x;}
395 :
394:2005/04/28(木) 04:42:40
あんま変わらんけど、こっちの方が良かったかな…?
double f(int N){double x;for(x=1.0;N>1;N--)x*=(double)N;return 1.0/x;}
396 :
デフォルトの名無しさん:2005/05/04(水) 18:36:51
397 :
デフォルトの名無しさん:2005/05/04(水) 19:00:23
>>396 大丈夫。真っ当なOSならアプリケーション終了時にきちんと開放する。
>真っ当なOSなら
OSが真っ当かどうかに関わらず真っ当な規格合致処理系なら、
exit()を呼んでいなくてもmain()からreturnすればファイルは閉じられる。
main()でのreturnはexit()の呼び出しと等価とも書かれている。(他の関数からmain()を呼んだ場合は別だが)
しかしfree()の方にはそのような記述は見当たらない。
(free()を呼ばないで終了するとどうなるかということは書いていない)
>>400 >(free()を呼ばないで終了するとどうなるかということは書いていない)
free() を読んで終了すればどうなるかということも書いていないけどな。
またこの話題か
好きにすれ
gotoを使うのは不味いのでしょうか?
どなたかおすえてください
Cで質問です。
変数nの値が??のとき、filename??という名前のファイルを開きたい
という場合に、fopenの第1引数にはどのように記述すればよいでしょうか?
先にsprintfを使えばできるようですが
直接引数の部分に記述して何とかする方法がないかと思いまして。
>>404 char *filename(int n) { static char buf[100]; sprintf(buf, "filename%d", n); return buf; }
fopen(filename(n), ... )
>>405 なるほど!その手がありましたか!
おめでとうございます!ありがとうございます!
(ノ´Д`)ノ 彡┻┻
次にこんなことをしてハマると見た。
rename( filename(1), filename(2) ); // filename.1 を filename.2 にバックアップ
>fopenの第1引数
そもそもパスとか編集しなくていいのか?
素直に
>先にsprintfを使え
そこでC++ですよ。
std::string filename(int n) {return "filename" + boost::lexcal_cast<std::string>(n);}
410 :
デフォルトの名無しさん:2005/05/09(月) 09:50:14
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
411 :
デフォルトの名無しさん:2005/05/09(月) 09:51:19
412 :
デフォルトの名無しさん:2005/05/09(月) 10:07:08
413 :
デフォルトの名無しさん:2005/05/09(月) 10:14:46
あと、2進数の桁をずらしたいときにも役に立つね。
>>410 任意の上位Nビットを取り出したいとかその逆をしたいときとかに。
DWORD dw = 0x12345678;
WORD wHigh = dw >> 16; // 0x1234
WORD wLow = dw & 0xffff // 0x5678
DWORD dw2 = dw << 16 | wLow // 0x12345678
<質問>
ピクチャポックに表示した画像をマウスドラッグで範囲選択します。
その選択範囲をマウスのドラッグ中、リアルタイムに枠線で囲みたいのですが
どういう処理が一般的でしょうか?
DrawLineで線を書いたり消したりとかは、おかしいですよね?
XOR
420 :
417:2005/05/11(水) 23:15:27
すまそん。
他で聞いてきます・・・。(・・`)
421 :
417:2005/05/12(木) 00:23:25
>419
もしかして、私へのヒント?
そうだったら、ありがとうございます。
ビット反転させたらいいのかなー。
とりあえず、C#の過去ログ見てます。
int main(void)
{
double i;
for(i=1.0; (int)i<=9; i=i+0.1) {
printf("%d", (int)i);
printf("%lf ", i);
}
return 0;
}
iが5.000000のとき(int)iがなぜ4になるのか分かりません。
小数部を切り捨てて5になると思うのですが。
>>422 誤差の累積。誤差について調べられたし。
>>417 まさしくそれ向けの関数がMFCにあった気がする。
MFCつーか、、、APIであるけど
今はもうXORの時代じゃないのかもなあ
いちおー書いておくか
APIなら
DrawForcusRect
MFCだと
CDC::DrawForcusRect
それよりも、CRectTracker クラス使ったほうがいいかも
427 :
426:2005/05/13(金) 16:39:17
ってここC#のスレだった・・・
スレタイで半角#使ったのか・・・
LSI C-86でコンパイルしてるんですが
unknown dimensionっていうエラーは
どんな間違いをしてる可能性があるんですか?
>>429 >どんな間違いをしてる
コンパイラの選択。
まぁ、恐らくは二重以上の配列で、要素数の指定が漏れているんだろうけど。
int func(int a[][]);
とかね。
二次元と表現せずに二重と表現するのが
Cらしいなw
クラス継承で教えて
class AandB : public A , public B
{
}
というのを作ろうとしたら
Aのメンバー関数で
A::data()
Bのメンバー変数で
char * B;;data
と名前が衝突していた.
B::dataのみにアクセスするにはどうすればいいの?
うまくいった
class AandB : public A , public B
{
AandB(){
this -> B::data
}
}
でアクセスできた
もうひとつ疑問が
class AandB : public A , public B
{
class B *pB;
AandB(): pB(&B)
{
}
}
pBにポインターの値を代入したいんだけどできない
>>434 class AandB : public A , public B
{
class B *pB;
AandB(): pB(static_cast<B *>(this))
{
}
};
キャストは要らないが一応書いておいた。
436 :
デフォルトの名無しさん:2005/07/10(日) 11:50:07
namespace your {
struct girlfriend {
void lips();
};
}
namespace my {
struct girlfriend {
static void lips();
};
class wife : your::girlfriend {
public:
void kiss() { girlfriend::lips(); }
};
}
さて、wife::kiss() するとgirlfriend::lips()によって
奪われるのは基底クラスの your::girlfriend::lips() か、
はたまた同じnamespaceにある my::girlfriend::lips() なのか?
VC7, gcc3.1 では基底クラス your:girlfriend::lips() で、
BCC564では 名前空間を優先して my::girlfriend::lips() でした。
どっちがせーかいでしょう?
雰囲気からして基底クラスを採るのがスジっぽいけど。
437 :
デフォルトの名無しさん:2005/07/10(日) 14:17:24
みなさん、コンパイラなどする時はコマンドプロントからやっていますか?
それとも編集もまとめて出来るフリーツールなど使ってらっしゃいますか?
まだプログラミング始めたばかりなんですが、コマンドプロントの方法もやはり覚えといた方がいいんですかね?
プログラムを学習する目的が限定されていて、コマンドプロンプトを使わなくて済むなら、
覚える必要はない。
授業でどうしてもやらなきゃいけないとか。
プログラミング全般に詳しくなりたいなら、覚えておいた方がいい。
439 :
デフォルトの名無しさん:2005/07/10(日) 19:03:07
学習目的でプログラムを組む際、教科書によってはコマンドプロンプトを前提としているものがある。
だから、教科書しだいかな。
個人的には、ツールを組み合わせることが楽なので、覚えるといいとおもう。
簡単な、初級プログラムというのはどうしても、コマンドラインを使った処理、
入出力になるからな。憶えるべきというか、憶えないと学習効率が悪いと思うぞ。
世の中に出ている初級者用のC言語情報なんて、ほとんどがコマンドラインを
前提としているからな。
やはりそうですか
分かりました、ありがとうございました。
IDEかmakeかって話だろ。
そんなの当面どうだっていいだろ。
質問
int a = 1;
if ( a == (int)0) {
...
}
のように、キャストした方がいいの?
いらない
この速度ならぬるぽ
447 :
デフォルトの名無しさん:2005/08/09(火) 01:41:05
Cを使った開発で質問させて頂きたいのですが
ありがちなDBを使った業務システムを開発するときに
MFCと.netフレームワークを比べると
どちらの開発効率が上でしょうか。
漠然とした質問ですが
主観等々で構いませんので、ご意見いただけますでしょうか。
MFCも.netもCじゃなくC++だが。
ありがちなDBを使った業務システムは開発効率より優先する
ものがあるんでねぇ?
oo4o+vbに1票
スレ違いだったらすみません。
自分用にデバグしやすいmalloc/realloc/freeを実装してみようと
思っていますが何を参考にすればいいかわかりません。
シンプルで小さい実装のソースがあったらURLを教えて下さい。
void *my_malloc(size_t size) {
void *p = malloc(size);
...hoge
...fuga
return p;
}
みたいのじゃだめなのか。
メモリアロケーションを実装するのは大変だと思うが。
#define malloc my_malloc
すみません、質問が悪かったですね。
端的に、mmap を実装してみたいんです。
ある組込の環境で、malloc がかなり遅い
環境があるんですが、自分で実装してみたら
それを速くできるのか、それとも自分だともっと
遅くなってしまうのか、興味があったのです。
あるファイルが存在するかどうかを確認するにはどうしたらよいのでしょうか?
出来るだけ環境に依存しない方法がよいのですが
>>456 環境依存しないと言うことなら、存在する≒読めるということで
fopen(targetFile, "r")が成功するかどうかで判断するのが無難。
まぁ、大抵の環境でaccess()かstat()はあると思うがな。
#某環境では、access()がfopen()で実装されているのは内緒。
K&Rにmalloc/freeの実装が乗ってる。
C言語一通り学んだらDirextXとWINAPIどっちやればいい?
>>459 C++
特にDirectXをやるのなら絶対。WinAPIをやるのでもなるべく。
そもそもDirectXはライブラリなどで隠されていない限りある程度WinAPIで下準備が要るから、
結局WinAPIの知識が要る。
461 :
デフォルトの名無しさん:2005/08/31(水) 11:32:56
a, bが変数だとして(…の中で変更される可能性あり)、
(1)
if (a == b) {
while(a == b) {
…
}
// ★
}
と
(2)
if (a == b) {
do {
…
} while (a == b) ;
// ★
}
は同じ意味ですか?
今(1)のコードで★部分にコードを追加したいので、
(2)に変えても問題ないか知りたいです。
while(a == b) {
…
}
if (a == b) {
// ★
}
のほうがまだ読みやすくない・・・?
>>461 積極的に(2)に変えたい理由は?
別に(1)のままでもいいと思うのだけど。
最初に一回無駄な比較が増える
>>462 >461 (…の中で変更される可能性あり)
「神戸 330 ふ 1234 この車はどうのこうの(箇条書き)」
sscanfで、上のような文字列を読み取るのに、
"%s %d %s %d %s"を使っているのですが、最後の備考欄に
空白文字が入っているとすべてが読み取れません。
「残りすべての文字列」というマークはありますか?
WinXp,VS.netです。
>「残りすべての文字列」というマークはありますか?
そんなものは無い。
fgetsで行末まで読んで、読んだ文字列を変換するのが良い
そうですか・・・ありがとうございます。
fgetsで読んで、4つ目の改行文字以降を読み取ることにします。
"%s %d %s %d %[\x01-\xff]"
条件演算子の? : は右結合ということですが、
a() { printf("a\n"); return 0; }
b() { printf("b\n"); return 0; }
c() { printf("c\n"); return 0; }
d() { printf("d\n"); return 0; }
e() { printf("e\n"); return 0; }
f() { printf("f\n"); return 0; }
g() { printf("g\n"); return 0; }
main() {
a() ? b() ? c() : d() : e() ? f() : g();
}
とした場合、結果が
a
e
g
となりました。
? : の右結合とは、どの部分に掛かってるんでしょうか?
472 :
デフォルトの名無しさん:2005/08/31(水) 21:46:37
↑結果を見ると左結合に見える、ということです。
>461
なぜ(2)の形にしたいのかがわからない。
必ず一回余分な判定が入るのが嫌程度なら(1)の書き方をお勧めする。
上から下への流れで読みやすい。
(2)だとループ条件がループの終わりにならないと分からないので
一部の人間からは嫌われてたりする。
自分は(1)はだね。
参考に
void loopfunc(void)
{
clock_t s[2], e[2], t[2];
int i, j;int a, b;
s[0] = clock();
for(j=0;j<100000000;j++){
a = 4568992;
b = -5621984;
if(a==b){
while(a==b){
a %= b;
a *= b;
}
b %= a;
}
e[0] = clock(); t[0] = e[0] - s[0];
s[1] = clock();
for(j=0;j<100000000;j++){
a = 4568992;b = -5621984;
if(a==b){
do{
a %= b;
a *= b;
}while(a==b);
b %= a;
}
e[1] = clock(); t[1] = e[1] - s[1];
printf("t[0] = %d\nt[1] = %d\n", t[0], t[1]);
}
>>474 if(a==b)の括弧が閉じてないので修正しましたが、
うちの環境では
t[0] = 2593
t[1] = 2384
(2)が速いみたいですね。
>>471 C言語の有名なバグです。
条件演算子の仕様的にも左結合で合ってます。
477 :
デフォルトの名無しさん:2005/08/31(水) 22:16:06
>>476 違うよー
1?2?3:4:5
と書けるのは右結合だから。(結果は3)
>>471 結合規則と評価順序は関係ないよ。
478 :
デフォルトの名無しさん:2005/08/31(水) 22:18:25
つまり右結合の掛かる場所は、括弧で括ると
1?(2?3:4):5
こういうことね。
>>478 し、知らなかった・・
これでもC言語暦10年なんだが。
main(argc, argv)
int argc;
char *argv[];
{
↑↓
main ( int argc, char *argv )
{
どうちがうの??
上 K&R
下 ANSI
上は古い書き方で、普通は下の書き方を使う。
意味上の差はない。
と思ったが、よく見ると下のargvがchar*になってやがる。
それ以外は同じ。
あと、戻り値の型もちゃんと明示したほうが良い
cdeclなら別にどうでもいいよ
int func(float a)
{
return sizeof(a);
}
と
int func(a)
float a;
{
return sizeof(a);
}
では違う結果を返すコンパイラもある。
485 :
480:2005/09/01(木) 00:37:29
ありがとうございます。
したのargvに[]が無いのは転記漏れでした。申し訳ない。
なんで?
ビット長が違う環境とか?
>484の後者はfloat aと書いてもdouble aと解釈されるのか。
流石にそこまで古いCは知らないなぁ。
488 :
デフォルトの名無しさん:2005/10/02(日) 20:41:06
以下の問題を配列を必ず使ってプログラミングしてください。
[課題2] 正整数を入力し、それをローマ数字で表示するプログラムを配列を使って作りなさい。
1000がM, 100がC, 10がX, 1がIであるので、たとえば、123と入力するとCXXIII、1365はMCCCXXXXXXIIIIIと出力できればよい。
<入力例>
Input: 3247
<出力結果>
MMMCCXXXXIIIIIII
お願いします。
489 :
デフォルトの名無しさん:2005/10/02(日) 20:56:21
初めて投稿します。
STLのiostreamヘッダを汎用テキストマッピングとして利用したいのです。
stringはtypedefで、std::basic_string<TCHAR>~としたのですがが、
iostreamはどうすればいいんでしょ?
なお、MS-Visual C++ ver 6.0で実験しています。
<ソース>
#include <tchar.h>
#include <iostream>
int _tmain(void){
// この coutとwcoutを一つにまとめたい。
std::cout << _T("Hello C++ World!\n") << std::endl;
return 0;
}
識者の皆様、ご教授お願いしたいです。
490 :
デフォルトの名無しさん :2005/10/02(日) 21:00:07
>>489 coutとかは型ではないからtypedefできない。
だからこうするしかないと思う。cinやcerr、clogも同じ。
#ifdef UNICODE
#define tcout std::wcout
#else
#define tcout std::cout
#endif
492 :
デフォルトの名無しさん:2005/10/02(日) 22:22:03
>>491 ご返答ありがとうございます。
なるほど、
cin, cout, cerr, clogはIOストリームオブジェクトなので、
defineで置き換えるしかないですか・・・
ご指摘を参考にしてみます。
493 :
デフォルトの名無しさん:2005/10/02(日) 22:57:40
>>488(前半)
#include "ctype.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
// 文字
static char code[4][2]={"I","X","C","M"};
int main(void){
int i, j, max, len, dec[4];
char inpbuf[5];// 4桁 + NULL
char outbuf[37];// 9文字 x 4桁 + NULL
// 初期化
memset(outbuf, 0, sizeof(outbuf));
memset(inpbuf, 0, sizeof(outbuf));
// 入力
printf("input:");
scanf("%5s", inpbuf);
494 :
デフォルトの名無しさん:2005/10/02(日) 22:59:11
>>488(中)
// 入力チェック
len=strlen(inpbuf);
for (i=0; i<len; i++){
if (!isdigit(inpbuf[i])){
printf("数値を入力してください\n");
return -1;
}
}
i=atoi(inpbuf);
if (i>9999 || i<0){
printf("数値は0-9999までの範囲で入力してください。\n");
return -1;
}
_itoa(i, inpbuf, 10);
len=strlen(inpbuf);
// バッファを数値に変換して
max=len-1;
for (i=max; i >= 0; i--){
dec[i]=inpbuf[i]-48;
if (dec[i]!=0)
max=len-i-1;
}
495 :
デフォルトの名無しさん:2005/10/02(日) 23:00:56
>>488(後半)
// 文字列作成
for (i=0; i <= max; i++){
for (j=0; j < dec[i]; j++)
strcat(outbuf, &code[max-i][0]);
}
// 出力
printf("%s\n", outbuf);
return 0;
}
くどいので、部分部分は修正してね
質問させてもらいます。
SDL_ttfでの表示の際にUnicode文字列が必要なのですが、
S-JISからUnicodeへの変換にはやっぱりICU使うしか無い
でしょうか?
質問なのでageさせて貰います。
いいえ
ぽいんた~がわかりまっせ~ん
おしえてくださ~い
E・∇・ヨノシ <500ゲット♫
501 :
496:2005/11/01(火) 10:13:50
変換するのは大げさなのでデータにUTF-8で埋め込むことにしますた。
>>496 ちなみにマルチバイト文字(char型)にShift-JISが使われていれば、mbstowcsという標準関数が使えなくもない。
文字コードについてなのですが・・
a b c d eなどはASCIIコードって事はわかってるのですが
"あ"とか"い"とかは何コードなのでしょうか
strcpy(str,"あ");
printf("0x%X\n",str[0]);
printf("0x%X\n",str[1]);
とか調べてみたのですが全然判らなくて・・
> a b c d eなどはASCIIコードって事はわかってるのですが
ここで既に終わっている
ぇー数値ASCIIの数値を当てはめて出力しても期待される文字が出力されましたが
>>503 Windows系ならShift-JISでUnix系ならEUC-JP。ほかは知らん。
Cとしては文字コードは一定の基準さえ満たせば何でも良いということになっているから、
特定の文字コードに頼り切ったコードは書くな。
>>502 すみませんorz
ありがとうございました
508 :
デフォルトの名無しさん:2006/01/08(日) 18:59:22
演算についてなんですけど
C言語において被除数=0の時の計算っていうのはまずいですよね?
例えば
0/3
0%7
などです。
うちの処理系では例外処理が加えられて0を返すようになってるみたいなんですけど
どうでしょうか
んなこたーない。
もし、本当に例外処理が行なわれているとしたら、その処理系は糞未満だ。
510 :
デフォルトの名無しさん:2006/01/08(日) 19:58:49
>>508 0以外を返すのは数学的にもアーキテクチャから見てもおかしい。
0 で割る方じゃなくて、0 が割られる方なのな。
>C言語において被除数=0の時の計算っていうのはまずいですよね?
なんでまずいって思ったの?いずれも答え 0 で数学的にも正しい結果でしょ?
どっちかに負数が入る場合は C89 では処理系定義の部分は入るけど、それでも結果自体は
規定されるから例外処理なんてない。
(C99 では 0 方向に丸めるよう規定されてる)
「5.4 整数除算」を参照の事
ttp://seclan.dll.jp/c99d/c99d05.htm#dt19990607
>>509-511 すいません少しこんがらがってました
0が除数である場合の計算でしたorz
>512
手元に C99 の規格書しかないけど、
> 9899:1999 6.5.5/5
>The result of the / operator is the quotient from the division of the first operand by the
>second; the result of the % operator is the remainder. In both operations, if the value of
>the second operand is zero, the behavior is undefined.
ということで未定義動作だから何が起こっても規格準拠だね。
514 :
デフォルトの名無しさん:2006/01/13(金) 09:35:53
こんにちは。質問です。お願いします。
C言語のif文で、条件式の中でfloat型の変数は使えますか?
こういう処理なんですが・・・
float fA,fB;
:
:
if(fA != fB)
{
:
}
例えば、for文の条件式とかで浮動少数型の変数を用いるのが
明らかに変なのは分かります。では、if文は、どうなのですか?
>>514 できるけど、やっぱり紙の上での計算と違って誤差が出るから
static float tol = 0.0001f;
float a,b;
if((a-b) < tol) {
/***/
}
とやるべきだろうね。
>>515 if ( abs(a-b) < tol ) {
/***/
}
なのでは?tolの値は妥当などうかも疑義がありますが
for(double d = 0.0; d < 100.0; d += 0.5)
誤差だけ気にしなければ別に変じゃないな
変だよ
519 :
デフォルトの名無しさん:2006/01/13(金) 15:27:00
sin(x)のマクローリン展開から√2の近似を計算するプログラムを作成したいんですが、どなたかご指導ご鞭撻の程お願いします。
sin(π/4)を2倍するところまではわかるんですが、マクローリン展開がどうもよくわからないので
520 :
514:2006/01/13(金) 18:21:16
早速の回答を有り難う御座います。
因みに、VC++を使っているのですが、前述の問題に関して
Debugモード、或いはReleaseの最適化を外すと
何ら問題が出ないのです・・・
コンパイラのバグなのか、誤差の問題なのか
悩むところです。。
自分のソースが悪い、に一票
>>520 浮動小数点数は同じ値でありながらビットイメージが違う場合も存在するから、
>516 の方法で丸めた方がいいよ。
tol の値は #include <float.h> して FLT_EPSILON 使えばいい。
見事にC言語のスレになっててワロタw
質問です。
#include<stdio.h>
#include<string.h>
#define N 32
void sorting(char*,char*);
main(int argc,char *argv[]){
char read[N*N],Memory[N][N],CASL[N][N][N];
sorting(CASL,read);
}
void sorting(char *CASL,char *read){
int i=0,j=0,k=0,z=0,I,J;
while(1){
I=i*(N*N);J=j*N;
if(*(read+z) == '\0') break;
else if(*(read+z) == ' '){
*(CASL+I+J+k) = '\0';
j++;k=0;
}
else if(*(read+z) == '\n'){
*(CASL+I+J+k) = '\0';
i++;j=0;k=0;
}
else{
*(CASL+I+J+k) = *(read+z);
k++;
}z++;}}
上記のプログラムでコンパイルするとwarning: passing arg 1 of `sorting' from incompatible pointer type
のエラーメッセージがでてしまいます。関数間での受け渡しで発生しているエラーだと思うのですが、どこを直せばいいのでしょうか?教えてください。
>>524 CASL の宣言か、sorting() の引数宣言 (プロトタイプ含む)
floatが整数かどうかの判定ってどうします?
if(x - (int)x == 0.0f)
で良いの?
キャストに頼るのが変な気がするんですが・・・。
> floatが整数かどうかの判定ってどうします?
移植可能な方法で、判定する方法はない。
>>528 こら。modfがあるだろ。
ちなみにfloat版はmodff。
>>529 modf(...) == 0 とするのか?
>>527 とたいして変わらんぞ、それ。
浮動小数点に対して == 演算子を使う奴は、大抵バカ
であることがまたもや実証されたな...。
>527だとintの範囲を超えたときに何が起こるかわからんからmodfの方がまし。
そもそも整数かどうかの判定が必要な値にfloatを使っていることがおかしい気がするが。
>>531 整数というか、小数の位が存在するかどうかで処理を変更したかったので。
modfで誤差を考慮しとけば良さそうですね。
配列の初期化について質問です。
int test[4] = {10, 100, 50, 1};
などの様に初期化したいのですが、
宣言した後で、このように一気に初期化する方法は無いのでしょうか?
具体的には、配列をクラスのメンバに持っていて、
コンストラクタで初期化したいのですが、
test[0] = 10;
test[1] = 100;
・
・
・
などのように、一つずつ初期化していくしかないのでしょうか?
536 :
534:2006/01/24(火) 14:38:34
コンストラクタでローカル変数
int l_test[4] = {10, 100, 50, 1};
を作って、それをメンバの配列にmemcpyすることで解決しました。
あまりキレイな解決策ではないですが、
実際は2次元配列で要素が多かったので、どうしても一気に初期化したかったのでした。
> コンストラクタでローカル変数
> int l_test[4] = {10, 100, 50, 1};
> を作って、
まあ、最近のマシンなら気にすることではないのだろうが、
static const をつけておいた方がちと早くなるかもし
れない。
何故vectorかなにかのコンテナを使わないのだろう。
>538
それはさすがにスレ違い。
このスレで「スレ違い」って言われてもな
スレタイに半角の#を入れようとしたのが問題
>>541 これってCすれじゃなかったのか!!!!
気付いてない子がいたのか・・・
for(;;);
for(;;)
といった文を見たんですがこういう文はどういう働きをするんでしょうか?
ループ・ザ・インフィニット! ・・・とかって言うとスタンドっぽくね?
>>544 forの括弧の中の3つのそれぞれの部分は省略できる。
2つのセミコロンの間の継続条件を省略すると無限ループになる。
547 :
デフォルトの名無しさん:2006/02/03(金) 16:06:33
>>546 すいません、ちょっと言葉足らずでした。
for(初期条件;終了条件;加算);
for(初期条件;終了条件;加算){
文;
}
こんな感じの文だったのですが、
最初のfor文の最後に ; が入った形をみたことがなかったので、
この2個のfor文がどのように動くのかを教えてほしいです。
548 :
デフォルトの名無しさん:2006/02/03(金) 16:16:08
rr
>>547 ↓こう書いたら解る?
for(初期条件;終了条件;加算)
;
>>549 何もしないんですね。orz
理解できました。ありがとうございます。
551 :
デフォルトの名無しさん:2006/02/03(金) 21:35:03
#include <stdio.h>
int main(){
int *pa[500],*pb[500],*pc[500],*pd[500],*pe[500],*pf[500];
int i;
for(i-0;i<500;i++){
*pa[i]=5;
*pb[i]=5;
*pc[i]=5;
*pd[i]=5;
*pe[i]=5;
*pf[i]=5;
printf("%d,%d,%d,%d,%d,%d\n",*pa[i],*pb[i],*pc[i],*pd[i],*pe[i],*pf[i]);
}
return 0;
}
このプログラムってかなりやばいよな;
553 :
デフォルトの名無しさん:2006/02/04(土) 16:45:57
構造体についての質問です。
#include<stdio.h>
struct string{
char *a;};
struct string data[]={
"a","b","c","d",};
int main(){
struct string *p;
char *s;
int i;
scanf("%s",&s);
p=data;
for(i=0;i<=3;i++){
if(s==(p+i)->a){
printf("%s\n",(p+i)->a);}}
return 0;
}
以上をコンパイルして実行した場合、scanfで入力した値がa~dのどれかでも
if(s==(p+i)->a)が真と判断されないのですが、間違いについての教唆をお願いします。
>>553 >間違いについての教唆をお願いします。
教え唆すのか?
そそのかされてどうする俺…
普通に間違いについて教えてほしいです
たとえば、scanf で "abc" という文字列を読み込んで、
それらの文字一つ一つ( 'a' とか 'b' とか 'c' とか '\0' とか・・・)は
メモリの何処に保管されるのさ?
今、値を記憶できる変数の領域は string 構造体のアドレスを保持する p と
char のアドレスを保持する s と
int の値を保持する i しかないぞ?
557 :
582:2006/02/04(土) 18:00:29
>>553 よーし、パパそそのかしちゃうぞ。
よくコンパイル通ったな。 構造体のメンバが char へのポインタ1つだけと判っていれば、
構造体配列 = { char*その1, char*その2, ・・・ , char*そのn }
なんて初期化が許されるのか ・・・ 知らなかった (マジ
ここは、
struct string data[]={
{"a"}, {"b"}, {"c"}, {"d"}
};
じゃなきゃ い神埼だと オモテタ。
でも、バグの本質は、
>>556 の指摘のとおり。
scanf() で、ポインタ変数にコンソール入力しようとしているが、おまえには特定の
char の場所を示すポインタ ( アドレス ) が判るのか? メモリの中身に詳しいヤツ
だな。
本当に唆しているだけだなお前ら。
559 :
553:2006/02/04(土) 19:25:32
>>556-557 charで*でなく適当な長さの配列を宣言して
if()で照会するのは2つの配列[0]に格納した値…ってことですね。
どうみても俺の勉強不足です。本当にありがとうございました
560 :
デフォルトの名無しさん:2006/02/13(月) 03:43:09
関数を定義するときに
void xxx(int yyy)
int A;
char B;
{
~~~
}
こんなふうに書かれたものを良く見かけるのですが
このときAとBは何か特別なものなんですか?
>>560 void xxx(int yyy)
{
...;
}
ならば、古いスタイルで
void xxx(yyy)
int yyy;
{
...;
}
となるがそのことだろうか。
それならばプロトタイプ宣言のなかった時代の名残だ。
Borland C Compilerのエラーメッセージについて詳しく解説している
『bcc32_messages』というファイルがあるのですが(中には数百のHTMLが
入っていて、エラーと警告1つ1つに細かい説明が書かれている)、どなたか
これの英語版がどこにあるかご存じないでしょうか?
COMMAND getCommand(char *c)
{
int i, j, k, l, len;
char comtmp[128], fileNametmp[128], comExtmp[128];
COMMAND command;
len = strlen(c);
for(i=0; i<len+1; i++){
if(c[i] == '-'){
for(j=0; c[i]!='\0'; j++){
i++;
if(c[i] == '@'){
comtmp[j] = '\0';
for(k=0; c[i]!='\0'; k++){
i++;
/*printf("\nc[%d] = %c\n", i, c[i]);*/
if(c[i] == '>'){
/*printf("\n>>in\n");*/
for(l=0; c[i]!='\0'; l++){
i++;
comExtmp[l] = c[i];
printf("\nc[%d] = %c\n", i, c[i]);
}
}
if(c[i] == '\0'){
comExtmp[k] = '\0';
command.com = malloc(sizeof(char)*(strlen(comtmp)+1));
command.fileName = malloc(sizeof(char)*(strlen(fileNametmp)+1));
command.comEx = malloc(sizeof(char)*(strlen(comExtmp)+1));
strcpy(command.com, comtmp);
strcpy(command.fileName, fileNametmp);
strcpy(command.comEx, comExtmp);
return command;
}
fileNametmp[k] = c[i];
}
}else if(c[i]!='\0'){
comtmp[j] = c[i];
}
}
}else if(c[i]=='\0'){
break;
}
}
command.com = NULL;
command.fileName = NULL;
command.comEx = NULL;
return command;
}
質問です。
このプログラム、-xxxxxx@yyyyyy>zzzzzz (x, y, z は不定)
という文字列から command.com = xxxxxx
command.fileName = yyyyyy
command.comEx = zzzzzzz
に文字列を分けて入れるプログラムです。
printfが変なところに3つあるのはデバッグのためなのですが、上から3つ目のprintfをコメントアウトするとバグが起こり、
コメントアウトしないでprintf出力するとバグが起こりません。なぜでしょうか?
-insert@123.bmp>rgb と入力した時、fileNameにstrlen()で文字列数を調べたところ、
3番目のprintf()をコメントアウトしなかった場合、7文字と正確に入っていて。
コメントアウトした場合、11文字とでます。
コンパイラーはbccの5.5で、windowsXPを使用しています。
Σ( ゜д゜)うわ
プログラム超見づらい。
すみません;;
566 :
542:2006/04/22(土) 00:08:46
ほら、皆間違えるw
実行ファイル(***.exe)の作成の仕方がわからないのですが…。
>567
一行目に
#!/bin/sh
って書いて
chmod +x
してから、ファイル名に.exeをつけるだけだよ。
今日はじめてc言語のテキストを買いました。
初心者です。
コンパイル時?に
インクルードファイル ’stdio.h’をおーぷんできない
とエラーメッセージが出てきました
テキスト読んでもわかりません
解決方法があれば教えてください
>>569 きちんとインストールしたか?
特にBorland C++ならbcc32.cfgなど。
>>570 どもです
cfgファイルを作ったんですが
コンフィグレーションファイル中の オプションの間違い と
難しいですね
572 :
デフォルトの名無しさん:2006/04/28(金) 07:22:00
コンパイルするとstudio.hが見つからないと出るのですが、バグですか?
573 :
デフォルトの名無しさん:2006/04/28(金) 07:29:26
stdio.hだよ。studioじゃない。
574 :
デフォルトの名無しさん:2006/04/28(金) 11:15:51
stdioがスタンダードI/Oだって知らないのかな
575 :
デフォルトの名無しさん:2006/04/28(金) 17:05:46
Cmachineと言うフリーソフト持っている方いませんか?
公開終了してたので・・・orz
持ってる方うpお願いします…
>>575 C のスレと間違うならまだしも、まるっきりスレ違い。
阿呆は帰れ。
577 :
575:2006/04/28(金) 17:19:26
>>576 書き忘れましたが、C言語のソフトです・・・
あほですいません・・・orz
初心者で本当にすみません
scanf関数を使っていたときに、パラメータに"&"を付け忘れました
俺のPCはあぼーんですか?
580 :
578:2006/04/28(金) 23:13:51
>>579 ありがとうございます。
さっき電源落としたんで、後で立ち上げてみます。
授業でscanf習った時に先生に死ぬほど脅されてたんで正直ガクブルです
ワロタ
-|"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
bcc32.cfg
コンフィグレーションファイル中の オプション間違い:-|"c:\Borland\Bcc55\include"
というエラーが出てしまいます
どうすればいいでしょうか?
教えてください。
|とIが区別出来るフォントを使えばいいと思うよ
>>583 ホントですか?
半角入力にですか。
テキストでは |とl の区別がなく書いてあるのでわかりずらいです。
>>583 ありがとうございました
|とiの違いですね。
warota
>>580 死ぬほど脅すくらいなら、最初っから教えなきゃいいのになぁ。
LSI C-86 Ver.3.30 試食版のことでお尋ねします、OSはWindows2000です
エスケープシーケンスを使いたいと思ってなんとか使えるようにはなりました。
しかし、カーソルを全角用の2文字分の長い方に変えるのはどうやってやったらいいでしょうか
↑同じ質問を違うスレでしていますが、いろいろ試行錯誤した結果での話です
決してマルチをしようとしたつもりはございません
何なら無視して頂いてもかまいません
それ以前にスレ違いだ。
>>1を読んでいないことがバレバレだぞ。
591 :
デフォルトの名無しさん:2006/05/08(月) 16:23:18
だから間違えたって言ってるだろ
ttp://cgi.2chan.net/up2/src/f137696.txt このコードをCygwinでコンパイルした結果
$ gcc -o client client.c
client.c: In function `main':
client.c:14: error: storage size of `server_adrs' isn't known
とエラー吐かれたのですが、修正方法が分かりません
修正方法教えていただけませんか?
594 :
593:2006/05/08(月) 22:09:10
>>593 だから激しくスレ違いなんだってばさ。
書き込む前に>1を読むとか直前の数レスを眺めるってこともできないのか?
cygwinスレかネットワークスレ辺りで聞いて味噌。
スペースで区切られた文字列を分割する関数を作ります。
・連続するスペースはひとつの区切りとしない
・スペースがない場合は全ての文字列を返す
・頭や後ろにつくスペースは無視
・返す文字列がない場合はNULLを返す
・初期値の文字列はNULLを引数に与えている間に変更されないもとする
・#include<string.h>は使わない
ですが、さっぱりわかりません。
どうか教えてください。
597 :
596:2006/05/09(火) 20:57:45
引数は( char * , const char * )です。
第1引数は区切られた文字列の格納先
第2引数はスペースで区切られた文字列(次の文字列を探す時はNULLを指定)
です。
宿題なら宿題のスレッドへ行くが吉。
599 :
デフォルトの名無しさん:2006/05/10(水) 00:11:15
#include <stdio.h>
main(){
float x=0.0;
double xx=0.0;
long i,n=100000;
for(i=1;i<=n;i++){
x=x+1/(float)(i*i);
xx=xx+1/(double)(i*i);
}
printf("from 1/1^2 to 1/%d^2, x(dbl)=%f, x(flt)=%lf\n",n,xx,x);
x=0.0;
xx=0,0;
for(i=n;i>=1;i--){
x=x+1/(float)(i*i);
xx=xx+1/(double)(i*i);
}
printf("from 1/%d^2 to 1/1^2, x(dbl)=%f, x(flt)=%lf\n",n,xx,x);
}
1/1^2+1/2^2+・・・+1/100000^2を計算するプログラムを作成せよという問題で、1/1から加えたときと1/100000から加えたときとそれぞれフロートとダブル型の4パーターン
比較する課題なんですが、実行するとバグってしまします。このプログラムのどこおかしいですか?コンパイラはborlandgccです
>>599 まずおかしいのはスレッドの選び方。ここはC♯のスレッドです。
次におかしいのは日本語。パーターンってなんです?
またおかしいのはコミュニケーション能力。バグってしまうだけでは何も通じません。
更におかしいのはコンパイラ。borlandなのかgccなのかはっきりなさい。
>>600 すげー眠いのでもうだめです。今日はねます。すいませんでした
603 :
デフォルトの名無しさん:2006/05/10(水) 00:23:46
ここをC言語のスレとして扱っちゃ駄目なのか?
>>599 iが65536以上の時、i*iは32ビットでは表現できないので、オーバーフローしているんだろう。
(double)(i*i)の代わりに(double)i*iとすればいい。
>>603 動作するようになりましたが、結果がおかしくなりました
605 :
デフォルトの名無しさん:2006/05/10(水) 00:54:51
>>604 ごめん、括弧が要る。
((double)i*i)
>>603 >ここをC言語のスレとして扱っちゃ駄目なのか?
じゃ、重複スレなわけね。
そういうことになるな。
じゃ削除だね
そういえば3月・4月のスレ削除依頼がまだ処理されてないな。
610 :
デフォルトの名無しさん:2006/06/03(土) 01:37:14
f (x) = cos (x) - x2 = 0 の根のうち、0 < x < 1 を満たすものを2分法で求める
初期値 a, b が入力でき、 6桁推定された解と関数 f (x) を呼びだした回数を出力する方法を教えてください。
>>610 細かな調整は勝手にやれ
#include <iostream>
using namespace std;
double f(double x){
double fx;
fx = cos(x) - x*x ;
return fx ;
}
double bisection(double a, double b,double (*)(double),int prc);
int main(){
double a,b;
double k;
cout << " a : " ;
cin >> a ;
cout << " b : " ;
cin >> b ;
k = bisection(a,b, f,100);
cout<<"cos(x) - x^2 := " << f(k) << " at " << k << endl;
return 0;
}
(2分法は次)
続き
double bisection(double a, double b, double (*func)(double ),int prc){
if (func(a)*func(b) >= 0) return a; //意味ないし a で十分w
double up, lo , m;
if( func(a) > func(b) ){ up = a; lo = b ;}
else { up = b ; lo = a; }
double workprod;
int workint ;
int counter=0;
while(1){
m= (up + lo)/2;
workprod = func(m);
workint = ((int)(workprod * 1000000)); // /100.0;
if(workint==0){
cout << "counter value = "<< counter <<endl;
return m;
}
if(workint > 0) up=m;
if(workint < 0) lo=m;
counter++;
if (counter > 20000) break;
}
return 0.0;
}
>>613 1?
笑わせるなヨ
ここは元々利用価値のないクズスレ
悔しかったら削除依頼出して来いヤw
612も読めねえクズが
615 :
デフォルトの名無しさん:2006/06/03(土) 23:14:16
カススレ晒しage
616 :
デフォルトの名無しさん:2006/06/03(土) 23:20:45
すいません、初心者なのですがdupという関数について教えてください。
openしたファイルポインタAをdupで複製?した場合というのはAをclose
すれば複製したファイルポインタもcloseされるのでしょうか?
dupの認識が違っていたらすいません
単利計算と複利計算を行うプログラムについて、質問させてください。
環境はWindowsXP.VS.NET2003。Win32コンソールアプリケーションです。
void main()
{
float a,r,c;/*r:金利c:複利*/
int i,y,method; /*預ける年数*/
printf("いくら預けますか?");
scanf("%lf",&a);
printf("何年間預けますか?");
scanf("%d",&y);
printf("運用方法を設定してください。単利なら0,複利なら1を入力してください。");
scanf("%d",&method);
if(method==0){
printf("金利はいくら(%%)ですか?");
scanf("%f",&r);
for(i=1;i<=y;i++){
a +=a*(r/100);
}
printf("元本は%f円になります\n",a);
}
else if(method==1){
printf("複利はいくら(%%)ですか?");
scanf("%f",&c);
for(i=1;i<=y;i++){
a = a*(1+r/100);
}
printf("元本は%f円になります\n",a);
}
else printf("終了します。\n");
}
ですが、いざ元本を出そうとすると、Stack around the variable 'a' was corrupted.
と表示されてしまいます。お力添えの程出来たらよろしくお願いいたします。
>>617 > scanf("%lf",&a);
scanf系において%lfはdobuleを意味する。
floatを使う必要なんてない。全部doubleでいい。
そもそもお金が絡むのに浮動小数点数を使ってよいのかという問題もあるが。
void main()を使う必要もない。int main()でいい。
>>618 ありがとうございました。
単利の計算が間違っていた(複利と一緒だったorz)。
ので直しましたが、それ以外はうまくいきました。
小数点以下は二桁まで取ることにしました。
ありがとうございました。
scanf("%d",&r);
scanf("%d",&h);
A=ff (r,h);
ff=f2;
V=ff (r,h);
printf ("表面積=%f 体積=%f",A,V);
return 0;
}(後は省略)
この問題でhとrをよみこみたいんですけど
こういうふうに書くとどんな数字を読み込んでも答えが0になって
しまうんですけどどこが間違ってますかね・
ちなみにscanfのかわりにh=1とかって定義すればしっかり値はでます。
すいません途中しかコピペしてませんでした。こんな感じです
#include <stdio.h>
#define PAI 3.14159
double a,b,r,h,A,V;
double f1 (double r2,double h2);
double f2 (double r2,double h2);
main(void)
{
double (*ff)(double r2,double h2);
ff=f1;
scanf("%d",&r);
scanf("%d",&h);
A=ff (r,h);
ff=f2;
V=ff (r,h);
printf ("表面積=%f 体積=%f",A,V);
return 0;
}
うはぁ、突込みどころが満載だ。
・doubleで計算したいならPAIは精度が足りない。
・そもそもPAIってなんだよw
・変数は極力グローバルに置かない方がいい。
・f1()とf2()が外部にあるなら、宣言はインクルードファイルで行なう方がいい。
・関数名は特別な理由でもない限り、中身が判る名前にしよう。
・main()の戻り値型は書くべき。
・実験的にやってみたいだけなら止めないが、関数ポインタを使う必然性がない。
・scanf()で型指定子を%dにするならint *を渡す必要がある。
・逆に、double *を渡したいなら型指定子は%lfだ。
・そもそもここはC♯の立て損なったネタスレだ。
ほんと、ごめんなさい
でも解決しました><
愚かな俺に教えて下さいまし、みなさま・・・
BYTE byData = 0x0f;
byData = byData << 4;
(VC .net SP 適用なし)
これ実行すると byData が 0 になる。
3 ビットシフトだとちゃんと 0x78 になるのに・・・。
なぜだぁぁぁぁぁ!!
>>624 自己解決
VC .net のシンボルウォッチのバグですた・・・
おぃおぃ、VC6 から劣化してどーすんのよ MSさん~~orz
2つ整数を入力して商と剰余を求めるんですが・・・
20-6=14 14-6=8 8-6=2 3回引いたので商が3、剰余は2、というふうに求めろ、という問題です。
商は4、剰余4と出てしまいます。
#include <stdio.h>
void main(void)
{
int a,b,c,d,e,f;
printf("2個の正の整数を入力\n");
scanf("%d %d",&a,&b);
if (b>=a)
{
c=b;
b=a;
a=c;
}
d=a-b;
e=1;
while (d>=0)
{
d=d-b;
e=e+1;
}
printf("商%d 剰余%d",e,d);
}
627 :
デフォルトの名無しさん :2006/07/19(水) 07:17:44
d>=0だったら一回余分に計算しちまいますね・・・
自己解決しました。スレ汚しすんません。
628 :
デフォルトの名無しさん:2006/08/15(火) 08:13:19
巨大な乱数ファイルの後ろから1文字ずつ消していき、
ファイルサイズを2GByteにすることってできますか?
ファイルサイズを取得するまではいけたのですが、
1文字ずつ消す方法がわかりません。
消す方法はありませんか?
>>628 一文字ずつじゃなきゃいけないの?
ファイルサイズを単純に切り詰めるだけでいいならbsd/POSIX系関数で
truncate()/ftruncate()なんてのがあるけど。
630 :
デフォルトの名無しさん:2006/08/15(火) 11:14:03
#include <stdio.h>
void mystrcpy(char *strA, char *strB);
int main(void)
{
char str1[11], str2[11];
puts("Input str1[11]");
fgets(str1, 10, stdin);
mystrcpy(str1, str2);
printf("str1 = %s\n", str1);
printf("str2 = %s\n", str2);
return 0;
}
void mystrcpy(char *strA, char *strB)
{
int i;
for(i=0; *(strA+i); i++){
*(strB+i) = *(strA+i);
}
}
strcpy関数を自分なりにつくっていたところ、上のようなものができました。
ですがコンパイルして実行すると文字列のコピーはうまくいっているものの、
変な文字列(文字化けした文字)も出力されてしまいます。
どこらへんがおかしいのでしょうか?
(環境はWinXPHome、コンパイラがBorland C++ 5.1.1です)
また、先週からC言語を勉強し始めたのですが、
ポインタを引数にしたり戻り値として利用するところが自分には少々難しいと感じています。
何かわかりやすい本やウェブサイトがあったら紹介していただけないでしょうか。
>>630 文字列の終端の'\0'をコピーしていない。
632 :
630:2006/08/15(火) 11:31:59
おお、まさにその通りです。
助かりました。
while(*(strB++) = *(strA++));
として解決しました。
633 :
デフォルトの名無しさん:2006/08/15(火) 13:35:40
>>629 一文字ずつじゃなくてもいいのですが、
ケツから2MByteくらいを消したいんです。
学校の課題なんで、切り詰めるだけでもばれないとは思いますが・・・。
#もし乱数データじゃなかったらばれるか。
#でもメモリ足りなくて開けないし・・・。
ここってC#スレ?
CとC#を一緒にすんなヴォケ
立てた奴の意図などどうでも良い。
>>633 き ゃ ぴりん ☆ き っく ! でググれ
質問です。
const int getHoge(){ return m_nData;}
というように、返り値にconstをつける意味はなにかあるのでしょうか?
ポインタなどを渡している場合ならわかるのですが、intやshortの場合の必要性がわかりません。
>>639 製作者がconstなんだと叫びたいとき。
というのは冗談だが、Cではともかく、C++では違いが全然ないわけではない。
int foo();
const int bar();
template<typename T>
void hoge(T& x);
void f()
{
hoge(foo()); //エラー:xはint&になるが、非constな参照型のインスタンスは右辺値で初期化できない。
hoge(bar()); //xはconst int&になり、constな参照型のインスタンスは右辺値で初期化できるのでエラーにならない。
}
まあ普通はこんなことを気にする必要はない。
>>640 ありがとうございます。
微妙な違いですね。
別のことを試してみたところ、const int getHogeは、
int n = getHoge()
とできてしまいました。全然constじゃないじゃん!
「エラー値とかだから計算する必要ないでしょ!だからconst!」って使い方をしようかと思ったのですが…。
素直にエラーはenumで型つけてやるほうがよさそうです。
ありがとうございました。
>>641 そりゃぁ代入しちゃえばconst性は失われますがな。
でないと、int foo = 100;すらできなくなってしまう。
/libpathの指定でProgram Filesみたいな空白のある場合ってどうすればいいのでしょうか?
#pragma comment (linker, "/libpath:\"/Program Files/XXX/lib\" ")
としてみましたがうまく動いていないみたいです
includepathの指定も#pragma でできないのでしょうか?
DrawStringでタブ"\t"を表現する方法を教えていただけないでしょうか
検索しようにも上記単語だと難しいので困ってます
>>645 ありがとうございます
そちらの参照先のように、決められた形(というのでしょうか)で表現したいのではなく
1 \t 222 \t 333
44444 \t 555
と表示する場合に3と5の表示開始位置が揃うようにしたいのですが
方法はないでしょうか
学校の課題で使うのですが、ガウスの消去法で4行4列の式を解くプログラム乗ってるサイトありますか?
サイトから引っ張ってきていいと言われたので・・・
探したんですけどいっぱいあってどれが正しいのかわかんなくて
結果が正しければどれでもいいのでは
649 :
131:2007/01/25(木) 21:12:22
すみません、誰か分かる人はいませんか?
どうしてもC言語でJPEG画像を表示したいんです。
おねがいします。
適当に解凍してただのビットマップを取り出せばいい。
jpeglibとかあるだろ
次に131がレスするのは2010年頃と予想
653 :
デフォルトの名無しさん:2007/02/15(木) 23:14:58
質問です!動的メモリ確保をつかったクラスみたいなものを作りたいんですが、
malloc() とfree()を使う方法では一つの関数内で完結させれば上手くいくのですが、
複数の関数でそれをやると上手く行きません。例えば↓では、関数b()で
エラーとなってしまいます。何故でしょうか?もう弱り果てています…
#include<stdio.h>
#include<stdlib.h>
void a(int*, int); //メモリ確保
void b(int*, int); //メモリ開放
main(int argc, char* argv)
{
int size;
int* array1;
int* array2;
size=10;
//うまくいく
array1 = (int*)malloc(sizeof(int)*size);
free(array1);
//うまくいかない!(bのところでメモリ領域破壊が…orz)
a(array2,size);
b(array2,size);
}
void a(int* array, int size){ array = (int*)malloc(sizeof(int)*size); }
void b(int* array, int size){ free(array); }
> void a(int* array, int size){ array = (int*)malloc(sizeof(int)*size); }
arrayはarray2のコピーであり、それを書き換えたところでarray2にmallocの戻り値は代入されない。
したがって未初期化のarray2をbに渡し、それをfreeしようとしてお亡くなりになる。
やるならvoid a(int** array, int size) { *array = (int*)malloc(sizeof(int)*size); }
>>653 関数a()に渡したarray2は、array2自体が何ら設定されていないのだがあんたの使うコンパイラは警告してくれないのか?
オプションで警告レベルを調整できるのなら引き上げておくことを進めておく。
で、件の目的なら>654でもいいがint * a(int size) {return malloc(sizeof(int) * size);}でもいいね。
#include <stdio.h>
void f(int i) {i = 42;}
void g(int* p) {*p = 42;}
int main(void)
{
int x = 7;
f(x);
printf("%d\n", x);
g(&x);
printf("%d\n", x);
return 0;
}
上と同じ理屈。短絡的に言えば引数経由で値を返したいときには*の数を1個増やすということになる。
#include<stdio.h>
#include<stdlib.h>
void MyAlloc(int**, int);
void MyFree(int*, int);
int main(void)
{
int size = 10;
int* array2;
MyAlloc(&array2, size);
MyFree(array2, size);
return 0;
}
void MyAlloc(int** array, int size) {*array = (int*)malloc(sizeof(int) * size);}
void MyFree(int* array, int size) {free(array);}
共有メモリ上にポインタを利用した連結リスト作成したいけど
どうやって作ればいいのですか?
>654-656
有難う御座いました!なぜダメなのかも解りました。
これで課題の〆切に間に合いそうです.。。
659 :
デフォルトの名無しさん:2007/03/02(金) 19:45:06
Windowsでマイクロ秒まで測る方法を教えてください
環境は、WindowsXP+bcc32です。
>>659 どんなアプリ作ろうとしてんの?
そもそもXPはRTOSじゃねーからマイクロ秒でなんらか
の値がとれたとしても精度はないよ?
661 :
デフォルトの名無しさん:2007/03/10(土) 13:47:24
Cを勉強したいんですが
まず最初に読んだらいい本ってありますか?
種類が多すぎてどれがいいか分からないんですけど
662 :
デフォルトの名無しさん:2007/03/10(土) 22:36:29
起動されているスレッドを順番に停止する関数を作りたいんですが、
何の関数を使えばいいんですかね?
pthread_join()は起動しているスレッドが自分で終了するまで待ってる関数だから
無限ループしているスレッドを終了できなし。
pthred_exit()はpthread_join()の戻り値を引数に使うからpthread_join()使わないと無理だし。
誰かお願いします。教えてください。
>>661 ナカーマ
しかし俺はさっきコンパイルという言葉を知ったモロ初心者><
#include <windows.h>
#include <stdio.h>
void main()
{
double a;
a = 2/6;
printf("%f\n", a);
}
VC6にて上のように単純に2÷6を計算したら0が出力されます。
0.33333・・・を出したいのですがどうすればいいのでしょうか?
↑
解決済みです
667 :
デフォルトの名無しさん:2007/05/14(月) 22:11:03
windowsXP上でcのプログラミングをしたいのですが
フリーのものでコンパイラ、エディタなどでお勧めのものを教えてください
なるべく日本語のもので見易さ、編集しやすさ最優先で、
linux上でも動かしやすいものであれば嬉しいです(←これはついでなのでそこまで重要でもない)
残念ながらcは英語をベースにした言語なので、「日本語のc」はありません。
>>667 Linuxなら、どのディストリにもgccが入っているだろうし、vi(vim)かそれが嫌ならemacsがあるだろ。
それを踏まえて、WinXPでもcygwin入れてgccを使えばいいし、取り敢えずvimでいいだろ。
672 :
デフォルトの名無しさん:2007/05/20(日) 03:27:08
OS:VineLinux
コンパイラ:gcc
こんばんは、ppm形式(フルカラーraw形式)の画像のピクセルごとの,R,G,Bの色のデータを
メモリを動的に確保して1次元の配列にぶち込みました。
これを任意の角度回転しようと考えているのですが、
どうも1次元の配列ですと直交座標で扱いにくく困っています。
そこで新たに二次元配列を動的に確保して・・・とも考えたのですが
元画像、出力画像のデータを取り込んでいるので、得策でもないような気がします。
なんとか直交座標系として扱いつつ、元画像を回転させて出力画像を作る方法ありませんでしょうか?
ソースがあるだとかよい案があればよろしくお願い致します。
674 :
デフォルトの名無しさん:2007/05/20(日) 06:03:17
printfの書式で14.850000や2.00や5.012000の様に小数点以下で最後に0が続く場合、
その0を省略する方法を教えて下さい。
675 :
側近中の側近 ◆0351148456 :2007/05/20(日) 08:16:09
>>674 (っ´▽`)っ
printf("%.0f\n", d);;
676 :
デフォルトの名無しさん:2007/05/20(日) 08:19:40
’0’、’1’、’2’、’3’を’-1’、’0’’、’1’、’2’に置き換えるためにhand=C-’0’-1とするのですが、この式の間の『’0’』の存在意義がよくわからないです。
677 :
側近中の側近 ◆0351148456 :2007/05/20(日) 08:29:08
>>676 (っ´▽`)っ
>hand=C-’0’-1
このCには文字が入っているんじゃないかな?
このhandには数値が入っているんじゃないかな?
Cに'3'が入っている時を例に挙げよう。
'0' = 0x30 = 48
'3' = 0x33 = 51
hand = 51 - 48 - 1 = 2
つまり、文字を数値に変換するために'0'の値を引いているの。
'0'(文字の0)と0(数値のゼロ)は違うのはわかるよね。
メモリに格納される時のビット列が違うの。
2進法で考えると
'0'は00110000、0は00000000で格納されるよ
679 :
側近中の側近 ◆0351148456 :2007/05/20(日) 08:34:52
>>674 >>678 (っ´▽`)っ
そうだった!
%.0fだと小数点以下が全く出なくなっちゃうね☆
680 :
デフォルトの名無しさん:2007/05/20(日) 08:38:50
あっ、はい。文字としての扱いのままでatoiとかはしてありませんでした。
大変ありがとうございます。ところで、、'0' = 0x30 = 48
'3' = 0x33 = 51
とゆう式の流れはまだ学習していません。できれば教えて下さい。
681 :
側近中の側近 ◆0351148456 :2007/05/20(日) 09:01:43
>>680 (っ´▽`)っ
文字コードだよ。
ISOとかそういう偉いところが0x30は'0'を表すって決めたんだよ。
ところで、0x30は「16進法で30」っていう意味だよ。
0xがつくと16進法
0がつくと8進法
ちなみに'\n'は0x0a、'\0'は0x00だよ。
682 :
側近中の側近 ◆0351148456 :2007/05/20(日) 09:06:10
683 :
672:2007/05/20(日) 09:21:35
>>673 ありがとうございます。
座標の計算関数はできてはいるんですが、力及ばず入出力を二次元配列でしか設計できませんでした
ということでそっちに行ってきます
684 :
デフォルトの名無しさん:2007/05/20(日) 09:23:06
大変ありがとうございます。やっと理解できました。
685 :
デフォルトの名無しさん:2007/05/20(日) 10:11:40
やっぱわかんないちす。51と48は何を表してるんすか?てか16進法わからないです。
686 :
デフォルトの名無しさん:2007/05/20(日) 10:19:34
やっぱわかりました。十進法ですね。
687 :
デフォルトの名無しさん:2007/06/05(火) 02:44:30
文字コードの話題がちょうどでてるので、タイムリーに質問。
cygwinでgccでコンパイルするときって、shift-jis以外は使えないんでしょうか?
ちなみに、OSはwin-xp proです。
「表」の字がコンパイルしたら、エラーがでました。
んで、色々しらべて、shift-jisがまずくて、他にもエラーがでる文字があるってことまではわかったんですが、
解決法がいまいちわかりませんでしたorz
もちろん、ソースの文字コードを色々と丸々かえて、再コンパイルしてみましたが、
完全に文字化けしてしまいました。
解決法とかはありますか?
また、もし、他の文字コードを使えるのでしたら、オススメの文字コードとかありますか?
>>687 つ input-charset
いろいろどころか全然調べてないだろ
ついでにexec-charsetも
んじゃ更に、
input-charset=euc-jp exec-charset=cp932
とか書いてみる。
692 :
デフォルトの名無しさん:2007/06/13(水) 13:28:58
グローバルで宣言してた変数などを
ポインタ等使ってローカルでの宣言で実装すると
常時使ってるメモリは少なくなると思うんですけど
速度的にはグローバルで宣言したほうが良いんですか?
>グローバルで宣言してた変数などを
>ポインタ等使ってローカルでの宣言で実装すると
>常時使ってるメモリは少なくなると思うんですけど
>速度的にはグローバルで宣言したほうが良いんですか?
グローバルかローカルかと言う議論にポインタは関係ない。
使用メモリを云々するほど広大なメモリを取り扱う話ならヒープを使うべきだ。
速度に関しては、実測が基本。
これの話にポインタは関係ないですけど、
複数の関数で共通した変数使う場合に
普通はグローバルで宣言してしまいますけど
ポインタなど使えばローカルの宣言でもイケるけどどっちが速いのか
って事を聞きたかったんです。
けど、実測しかないですか。
メモリも抑えなきゃいけないんだけど速度を最重視して作らないいけなくてorz
>>694 >複数の関数で共通した変数使う
ために
>ポインタなど使えばローカルの宣言でもイケる
というのはつまり、malloc() 等でヒープを確保するんだろ?
>普通はグローバルで宣言
した場合は static なデータとしてロード時に確保されるわけだが
使用するメモリ量にはまったく差がないし、速度にも有意な差があるとも思えん。
よって益々、
>>693 の結論通り。
速度は変わらないんですね。
それだけ教えていただいて感謝してます。
ありがとうございました。
ただ、メモリ量は差はあると思われます。
スタックとヒープの区別もつかないやつが、「差はあると思われます」と言ってもなあ・・・
メモリ使用の差の話は、静的確保だとプログラムの実行期間中ずっと
確保されたままなのに対して、動的確保だとそうではない、ということだろ。
>常時使ってるメモリは少なくなると思うんですけど
寒いなスレ開いちまった。。
間違った事言ったなら質問者と回答者の立場はどうあれ一言くらい・・・
初心者とか中級者とか上級者の堺はどのあたりだと思いますか?
大阪のあたりじゃね?
境でした。。すみません
鳥取のあたりじゃね?
東京にも武蔵野市に境がある
住所にはないのに、町田市の駅にも境がある。
私はあなたたちを少しかいかぶっていたみたいです
こんなにイライラするレスを返されたのは初めてではありませんが
それでもかなり上位に来るうざさだと思います
日本語が通じてるのにわざと他の意味を探す病気がPGには流行っているみたいですね
私の知り合いもそういうビョーキにかかっている時期がありました
本人はただふざけているだけのようなのですが
周りからしてみればはたはた迷惑です
面白くもなんともないのに本人は延々とボケを続けるんですからね
あなた方もそれと同じ事やっているんですけどどうですかわかりませんか
全然面白くないですよ少しはバラエティ番組でも見たらどうでしょうか
バラエティ番組見たからってあなたたちが面白い事を言えるとは思いませんが?
冷めるネタくらいは学習できると思いますちょっとあまりにもこれは酷い流れだと思います
更新されてないスレッドでもお気に入り登録にして毎日巡回でもしているんでしょうかね
質問スレで質問する人回答する人、スレは違っても同じだったりすることがよくあるんじゃないでしょうかね
けれど同じスレで違うことを聞かばスレ違いと言い別のスレで同じ人が答えたり?面白いですねそういうの
このスレの人達は凄くつまらないです一ミリたりとも笑える要素がないと思います
笑えるスレにしてくださいとは言いませんがこういう流れを作るんだったら
もう少しひねるとかしてくださいねってくださいね
もう少しひねるとかしてくださいねってくださいねってくださいねってくださいねってくださいねってくださいね
いかん、流石に飽きた。
>>706 初級とか中級とかワケ解らん質問したのお前なのか?
くだらん質問をしたのを反省しろよ
>>706 人の振り見て輪が振りなおせ。そのレスもおもしろくないぞ。
おもしろくしたいと思うなら、まず自分からおもしろいレスというものを見せてほしい。
まあでも、この板にいるような人間なんて、それが本業ではないのだから、
おもしろさを期待するほうが間違っている。
と、やっぱりおもしろくないマジレスを返してみる。
711 :
デフォルトの名無しさん:2007/07/01(日) 21:21:08
数式Parserのライブラリってご存知ないでしょうか?
複素数計算機能を付加したいんですが、
bcに丸投げというのも力づくすぎるような気がしてまして・・・・
初歩的な質問で申し訳ないです
文字エンコードについての質問ですが、
HPから特定の文字列を検索して取得するプログラムを作ってたんですが、
対象のサイトの文字コードがEUCの場合、一旦JISに変換して文字列比較をしないといけないですよね?
文字エンコード変換の、簡単なソースを知ってたら教えていただけないでしょうか?
>>712 EUC⇔SJIS⇔iso2022の変換は難しくないが、どうせUTFとの変換で悩む羽目になるから
iconvか何かのライブラリを使っとけ。
>>713 返信ありがとうございます。
勘違いしてました。
オープン・ソース使ってうまくいかないと思ってたら
EUC -> SJIS しなくてはいけないのに
SJIS -> EUC としてました。
お手数かけましたm(_ _)m
715 :
デフォルトの名無しさん:2007/07/02(月) 00:15:07
初歩的な質問ですがよろしくお願いします。
とある関数内で、malloc()でヒープ領域を確保して
得たポインタを別のタスクに投げ渡すという処理をしています。
他のタスクに投げ渡したら領域を確保した関数は、終了します。
malloc()で作った領域は、free()を行うまで領域の確保されているんですよね?
逆にmalloc()のヒープ領域で無く関数内で定義した変数のポインタだと
どうなってしまうんでしょうか?
関数終了しても変数のポインタさえ分かればどこからでも
値は取り出せそうなのですが・・・・・。
聞きたいこととしては、
・malloc()で得た領域は、関数が終了しても参照できますか?
・malloc()の代わりに関数内で定義した変数でも関数終了後に参照できますか?
です。よろしくおねがいます。
>・malloc()で得た領域は、関数が終了しても参照できますか?
yes
>・malloc()の代わりに関数内で定義した変数でも関数終了後に参照できますか?
int *f(void)
{
int local;
return &local;
}
みたいなの?
それなら、関数終了時点でポインタは無効になる。
717 :
デフォルトの名無しさん:2007/07/03(火) 01:18:45
>>716 レスありがとうございます。
>・malloc()の代わりに関数内で定義した変数でも関数終了後に参照できますか?
の質問に対する例題としては、似たような感じです。
下のようにローカルなスコープで定義した変数を
他タスクに渡して処理を終えた時にもint localのポインタは有効であるか?
と言う事が気になってたのです。
丁寧な説明ありがとうございました。
int f( void ){
int local;
test(&local); /* 他タスクへイベント要求 */
}
718 :
デフォルトの名無しさん:2007/07/03(火) 11:19:17
無効
>>717 それだったら test() を終了後も local は使えるよ。
int local は f() からリターンするまで有効。
>>719 質問を読み違えてないか?
タスク云々といってるんだから、testが引数をなんらかの形で保存していて、
それがfが終わった後も有効かという話だろ。
testがポインタをグローバルな変数に入れたり、longjmpしたりするんかいな
>他タスクに渡して処理を終えた時
これがどういう・・
別スレッドに渡したり。
ただでcをやりたいんですが、なんてソフトをDLするといいですか?
725 :
デフォルトの名無しさん:2007/07/04(水) 00:42:18
環境は?
726 :
デフォルトの名無しさん:2007/07/04(水) 00:44:16
まあwindowsならBCC(Borland C++Compiler)で間違いないと思うよ。
CもC++もいける。
けどサイトが長い間落ちてるっぽいね
よくわからんけど
727 :
デフォルトの名無しさん:2007/07/04(水) 00:54:28
>>726さん
虫けらLevelの質問ですみません。
今日書店でC++ Buiider 6.0というのを見たんですが、
Buider 6.0ってなんなんですか?
後、聞きたいんですが、
トロイの木馬やキーロガー、白木葉子はどの言語で作れるのでしょうか?
728 :
デフォルトの名無しさん:2007/07/04(水) 00:57:01
そんなものが作りたいなら自力で全部やれ
そうでない限り作れん
729 :
デフォルトの名無しさん:2007/07/04(水) 01:04:35
>>728 自力……かぁ(´・ω・`)
まぁ…確かになぁー…
甘えてられないか
そういうのは”ログが残らない場所”で聞け
てかいろんな意味で貴殿はC/C++やられるのが良いと思う
俺は作った事無いから、作った事ある奴じゃないとわかんないと思うけどな
732 :
デフォルトの名無しさん:2007/07/04(水) 09:20:18
bccぐらい凡人でも猿でも軽々入手できるもんなんだから
そんなところで2chの質問スレに頼ってるようじゃ
何も書けんぞマジで
本当にやる気あるのか
いやいや、凡人や猿は何も考えずにVS買うよ
買ってくれておおいに結構
734 :
デフォルトの名無しさん:2007/07/04(水) 12:21:42
>>731 本買おうと思う。
開発環境は…どうなのかな家のPCネット繋がってないから
ネットカフェとかしかないんだ
>>724 KNOPPIX, Debian GNU/Linux, Fedora 7, Vine, Plamo, ...
736 :
デフォルトの名無しさん:2007/07/04(水) 16:35:05
…マイクロソフトのVisual C++ 6.0(開発ツール)って高いんですか?
いまさらそんなバージョン買うなよ
どうしよう
739 :
デフォルトの名無しさん:2007/07/04(水) 17:02:53
>>737 今はどんなバージョンがあるんですか?
後…高い?
VC++6.0 → 2002 → 2003 → 2005
今は2005だな、EEなら無料。
MFCとリソースエディタが無いけどな。
>>739 Visual C++ 2005 Express Edition 無料
Visual Studio 2005 Standard Edition 3万円弱
Visual Studio 2005 Professional Edition 11万前後
742 :
デフォルトの名無しさん:2007/07/04(水) 17:26:00
>>742 2005のEE=Express Editionは無料
今からプログラミング始めるの?
ググる事くらい覚えないと習得できないよ
>>741 Academic (中身はStandard) 4,800円もあるだろ。
745 :
デフォルトの名無しさん:2007/07/04(水) 18:06:19
>>743さん
ググれますが、携帯からしかネットできないんです
んでもって俺プログラミング初めてなんです。
FLASHLITE
XHTML
PHP
かじった程度の人間ですから。
>>741さんは何を使ってるんですか?
>>745 自分はProfessional版使ってるよ
これから勉強を始めるならExpress版でも十分できる
物足りなくなってから上位のバージョンを買えばいいと思うよ
或いはその頃には次期バージョンが出てるかもしれないし
じゃあまずPCでネットする環境を整える事から始めよう
747 :
デフォルトの名無しさん:2007/07/04(水) 18:15:35
>>746さん
優しいですね(´・ω・`)
ありがとう
748 :
デフォルトの名無しさん:2007/07/05(木) 11:44:35
私のコーディングスタイルは、
グローバル変数 int ThisIsIntExtern //単語の先頭を大文字
ローカル変数 int thisIsIntLocal //単語の先頭を大文字(ただし最初の文字は小文字)
関数 void this_is_function(){ } //全部小文字で、下線でつなぐ
#define THIS_IS_MACRO //全部大文字で、下線でつなぐ
なんですけれど、変でしょうか?
749 :
731:2007/07/05(木) 13:56:16
>>734 初心者なら本買ったほうが良いね
Visual Studio買う以外の手段には
ネットカフェでbcc落としてメモリに入れて持ち帰るって事も出来るんだが手こずるかも
付属のCD-ROMとかにコンパイラが入ってる本を買う手もある
けどね、分からない所はすぐぐぐれないとやってらんなくなるかな
>>748 別に統一されてりゃいいんじゃね?
Cのみだけど、俺の場合は
グローバル int g_iValue;
ローカル int iValue;
関数 int GetValue( void )
定数 #define VALUE_MAX
基本的に定数以外で"_"を使わない。
大学の講義などでC言語を教える立場に立つ為にはどれほどの勉強が必要なのでしょうか
ちなみに私は今までさまざまなプログラムを作成してきていてそれなりにCを使えるようになったと思うのですが
その先はどうやって勉強すればいいのか?
というのは将来、教授になりたいのですが
近い将来に助手になったときにプログラミングを学生に教える立場になるわけです
Webサイトで先生方の講義資料などを拝見してみますと、自分の知識力の低さを痛感するばかりです
とはいっても詳細な入門書レベルの内容なら全て空で説明するくらいはできるのですが
問題はその先なのです
>>752 入門書なんていう役に立たないものを基準にしている辺りでダメ過ぎ。
>>753 プログラミングの講義はプログラミング言語の使い方を教える講義です
役に立つか立たないかという有用性は、工学的には非常に重要な要素ですが
それはプログラムを作る者それぞれの価値基準に基づくものであり
教える人間が考える有用性を基準に講義すべきでは無いと思います
>>752 講義資料を見て自分はまだ知らないと気づいた事って何?
最初から本買わせればいいじゃん
あなたは本に書いてあること繰り返し説明する手間も省けるし
学生も本読めば済む気だるい講義を飛ばしてさっさと応用を学べる、万々歳
講師なら言語の歴史や規格についても詳しくないとやだな。
環境依存のコードをさも標準かのように教えられたらたまったもんじゃない。
Cだけじゃなくアセンブラとかにもある程度精通してて欲しい。
少なくとも、例えばswitchとif-elseの羅列が最適化で大抵マシン語レベルで同じになるとか位は。
あとは、同じことを100回聞かれても折れない心と、mainが1000行あっても
解読できる根性があればいいんじゃね?
ちゃんと教えないと自分が凄く読みずらいコードを数十人分解読する羽目になるわけか
考えただけでおそろしくなた
×読みずらい
△読みづらい
○読み難い
× △読みづらい
○ ○読みづらい
やんでるか?お前ら
神経質なのはプログラミングだけで良いんだぞ
×やんでるか?
○やんでるのか?
やってるか?
あめならやんでるよ。
765 :
デフォルトの名無しさん:2007/07/12(木) 13:22:48
C言語をはじめようと、近所の図書館で「C言語を256倍使うための本」
なる本を借りてきたのですが、最初の数ページ目にCをやる前に、
パスカルとアセンブラをやれ、とあったのですが俺はどうすれば?
そんなクソ本やらずにサイトでも見てやれ
Programing PlaceとかWisdomsoftとか
Wisdomの人って若いよなー。
1981年って事は、今25~26歳か。
自分の努力不足が身に沁みる。
256倍使うための本シリーズは全部糞本だから^^;
くだらねー本量産してんじゃねーと思う^^;
>>765 その本はあれだ、当時のマニア本だから。今勉強するために読む本じゃない。
770 :
765:2007/07/23(月) 22:10:38
レスをくれた人たちへ。
とりあえずアセンブリをやろうとMIPSの教本を同じ図書館で入手。
最初の数ページ目にC言語を先に理解しておく必要があるとあり、
無限回廊に突入。
772 :
デフォルトの名無しさん:2007/07/25(水) 18:15:09
型の一時的な変換に関しての質問です。
もともと整数型,char型のデータをある関数内では実数型として扱わなければならないので
下のコメントのように別の配列を用意しました。
代入する際にキャスト変換(double)を使って型を合わせようとしたのですが
'double **' 型は 'int **' 型に変換できない(関数 main(int,char * *) )
2 番目のパラメータは int ** 型として定義されているので double ** 型は渡せない(関数 main(int,char * *) )
というように実数型に変換したつもりなのに整数型のままだったりするようです。
どうすれば正しく型変換できるでしょうか
#include<stdio.h>
int main(int argc, char **argv) {
unsigned char *data={1,0,1,1};
int **P={{1,0},
{0,1}}; //この2つが本来のデータ型
double a;
int i,j;
double *data2, **P2; //コピー。ある関数function内でdouble型で扱う必要がある
for (i=0;i<2;i++) {
for (j=0;j<2;j++) {
P2[i][j] = (double) P[i][j]; //型を合わせるために(double)でキャスト変換
}
}
for (i=0;i<4;i++) data2[i] = (double) data[i];
function(a,P2,data2);
}
void function (double x, double **y, double *z) //ある型変数の型定義
まてまて、配列でも構造体でもないものを{ }で初期化できないだろ。
774 :
デフォルトの名無しさん:2007/07/26(木) 07:27:42
ポインタだけ宣言して領域の確保がされてないし
いきなり2次元配列でコピーしてるし
2次元配列のポインタだけ渡しても大丈夫な関数なのか
上から下まで勘違いでできているな
でも文字列だけ定数置けるのって理論的におかしいよな。
別に
>>776 const int という意味ではないんだよね
Object not found!
蔵書整理してたら秘伝C言語問答ポインタ編が
amazonのユーズド価格がクソ高くなってるの発見したんだがなんなの?
とりあえず出してるだけだろ
自由に設定できるんだし
あ、値段設定って自由なんだ。
絶版本て高く売れるのかな。
本にもよると思う
なんか絶版になった参考書は高く売れたりするとか
前アマゾンで本を売りまくってる人の番組中にやってたよ
質問させてください。
以下のエラーメッセージが表示されてリンクに失敗しています。
考えられる原因があったら教えてください。
undefined reference to `__stdoutp'
回答させてもらいます。
以上の情報では詳細の回答ができません。
より詳細な回答が必要なら情報をください。
__stdoutpが見つからない。
何をどうしたら出たのか
789 :
デフォルトの名無しさん:2007/09/09(日) 12:45:04
質問です。
外部から提供されているヘッダーファイルにエクスポート用の関数が記述されており、
ヘッダーに手を加えずにこの関数に処理を追加したいと考えています。
そこで、#define で関数名の変更を試みたのですが、
error C2084: 関数は既に本体を持っています。
となってしまいました。
ヘッダーは今後も修正が入りそうなので、手を加えるのは回避したいのですが、
何か良い方法はあるでしょうか。
--test.h--(外部提供のヘッダーの例)
extern "C" void __stdcall test(int a, int b)
{
printf("%d + %d = %d\n", a, b, a+b);
}
--test_ex.h--(関数名を置き換えて、代わりにエクスポートさせたい関巣をを記述)
#define _test(a,b) test(a,b)
#include "test.h"
#undef _test
extern "C" void __stdcall test(int a, int b)
{
printf("合計出力\n");
_test(a, b);
}
790 :
デフォルトの名無しさん:2007/09/09(日) 13:20:43
>>789 #define test(a,b) _test(a,b)
#include "test.h"
#undef test
じゃないか?
>>790 あ、あれ。オオボケしてました。
意図した通りになりました。ありがとうございます。
VC++ Express 2005 の C/CLI で質問良いですか?
関数に System::String ^XX を引数渡しして関数内でXXに値をセット
させようとしてるんですけど、これってひょっとして無理ですか?
String のメンバ関数って新規にインスタンスを作る関数はあるんですけど、
既存コントラスタの内容を「変更する」メンバ関数が無いんですけど・・・。
WCHAR やら char を素直に引数に使った方が良いんでしょうか・・・
VC Express 2005 + WindowsSDK で
Get/WriteProvateProfileString のラッパークラスをマネージドで作ってるんですけど、
これってひょっとしてかなり無謀ですか?API呼び出しはさすがにアンマネージドですが・・・
そもそも、VCのマネージドコードってひょっとして誰も使ってない?
.Net勉強するなら素直にC#でしょうか?
VCで.Netの勉強がてらマネージドでガリガリ書いてるんですけど、
まさか全然イミネェータイムしてます?
793 :
デフォルトの名無しさん:2007/10/22(月) 00:52:02
System::Stringは書換不能な文字列。
どうするかというと、例えばSystem::String^% XXにするという手がある。
http://msdn2.microsoft.com/ja-jp/library/h9t2463y(VS.80).aspx
ネイティブで言えば、これでは呼出元に反映されないから、
void f(char const* p) {
p = "hoge";
}
こうするというのと同じこと。
void f(char const*& p) {
p = "hoge";
}
.NETの勉強についてだが、<C++を十分に理解しているのなら>、
C++/CLIでも構わないと俺は思う。逆にC++をよくわかっていないのなら、
素直に.NETに関してはC#で勉強すべき。
>>793 動きました、ありがとうございます!
基本的な事なんでしょうが、個人レベルで言語理解は難しいですね・・・。
クラス自体を static ref に出来なかったりと色々苦労してます(汗
C++は「わかってるつもり」ですが、<static_cast>やら<reinterpret_cast>やらで
また勉強し直す必要がありそうです。
C#はwiki見た感じだと文法が凄く変わってるので一度じっくり
勉強しないと駄目ですね・・・
まさかC#がここまで市場を謁見するとは思いませんよ、普通(汗
APIが恐ろしいほど使いにくいC#に需要があるとは・・・
>まさかC#がここまで市場を謁見するとは思いませんよ、普通(汗
席捲だろ。とてもそうは見えないが。
質問なのですが、表示される文字の大きさを変えるにはどうすればいいのでしょうか?
モニターを買い換える。
>>797 それは「文字のサイズを変える」プログラムはどうすればいいか?ってことだよな?
800 :
デフォルトの名無しさん:2007/10/26(金) 14:12:47
アセンブラって何?
アセンブリ言語のプログラムを機械語のプログラムに変換するプログラム
802 :
デフォルトの名無しさん:2007/10/31(水) 11:38:23
C++を学習するのに適切な書籍、WEBを紹介してください。
機械語、Cなどの言語は習得済です。
質問です。
バイナリファイルを開いて、ファイルの先頭から順番に0、1を判別していきたいのですがどうすればいいでしょうか?
rbでファイルを開いてから後がどうしていいのかさっぱりわかりません。
getc(fp) でファイルの先頭から順番に 1 バイトずつ読み込める
mmapとSystem Vの共有メモリって、
どちらにどういう長所短所があるんでしょうか。
806 :
デフォルトの名無しさん:2007/12/08(土) 04:59:38
bcc5.5って実行が長いプログラムだと途中で止まるとか仕様ある?
807 :
デフォルトの名無しさん:2007/12/08(土) 05:28:15
ないだろ
だよな。同じプログラムを100回動かそうと思ってやってんだけど90回はできて100回はできない・・・
810 :
デフォルトの名無しさん:2007/12/09(日) 00:33:09
>>808 そりゃどっかにバグがあんだよ。
勘だけど、メモリがらみと見た。
int型のiを文字列に直す方法はありますか?
コンパイラはgcc, 言語はC言語です。
あとstrcatが3つ以上の引数をとれないようなのは仕様ですか?
> int型のiを文字列に直す方法はありますか?
sprintf,snprintf
> あとstrcatが3つ以上の引数をとれないようなのは仕様ですか?
三つ目に何渡す気だ
いや
"a" + i + "b"
のようなことがしたいので、
strcat("a", i, "b");
と出来たらなと。
C++をやりましょう。
簡単にできますから。
sprintf()でなにが不足なんだ?
sprintf(buf, "%s%d%s", "a", 3, b);
教えてください。union ビットフィールド型を引数としてわたしたいのですが、
それは可能なのでしょうか?
819 :
817:2008/01/15(火) 20:56:24
>>818 union { /* WCER */
unsigned char BYTE; /* Byte Access */
struct { /* Bit Access */
unsigned char B7:1; /* Bit 7 */
unsigned char B6:1; /* Bit 6 */
unsigned char B5:1; /* Bit 5 */
unsigned char B4:1; /* Bit 4 */
unsigned char B3:1; /* Bit 3 */
unsigned char B2:1; /* Bit 2 */
unsigned char B1:1; /* Bit 1 */
unsigned char B0:1; /* Bit 0 */
} BIT; /* */
} WCER; /* */
このような定義がある場合に関数funk()の引数にWCER.BIT.B1を渡し、
関数内でB1の値を変更したいのですが、コンパイラが直接ビット操作のマシン語に置き換えるために、
引数や変数にはビット情報を保持できないと思っています。
その操作が必要なアドレスやビット位置を引数として渡して操作することは可能と思うのですが
処理速度を求めるためにビット直接操作したいのです。
WCERごと渡せばいいんでないの?
速度が欲しくて1ビット単位の書き換えとか頭おかしいんじゃね?
822 :
817:2008/01/15(火) 23:53:14
>>820 ありがとうございます。
WCERではなく、結合先によってビット位置が異なっています。
>>821 マイクロ秒単位で処理をつめていますので毎回ビット位置計算をすると相当な重さになってしまいます。
ビットフィールド使うのをやめるといいと思うんだ
>このような定義がある場合に関数funk()の引数にWCER.BIT.B1を渡し、
>関数内でB1の値を変更したいのですが、コンパイラが直接ビット操作のマシン語に置き換えるために、
>引数や変数にはビット情報を保持できないと思っています。
いいえ。ビットフィールドは渡せませんが、ビット情報は渡せます。
>処理速度を求めるためにビット直接操作したいのです。
いいえ。ビットフィールドを直接扱うことが最速とは限りません。
>WCERではなく、結合先によってビット位置が異なっています。
「結合先」ってなんですか? 自分語りをされても困りますが。
>マイクロ秒単位で処理をつめていますので毎回ビット位置計算をすると相当な重さになってしまいます。
いいえ。そんなのんびりした処理をするのなら多少重くてもなんら影響しません。
そもそも、ビット位置の計算は決して重い処理じゃありません。
結論。
>823
825 :
デフォルトの名無しさん:2008/01/21(月) 20:09:47
Cプログラマの為に、ポイントをまとめたドキュメントを販売しています。
プロのプログラマでもあまりにレベルが低い人が多すぎます。
そんな人に限って、自分のレベルの低さを自覚していない、、、
本人は構わないかもしれませんが、その下についた新人プログラマは
たまったものではありません。(私が経験しました。)
今になって分かりました。
彼らもまた、理解できていなかったのです。
プログラミング言語の一番の習得の近道はきちんと理解している人にアドバイスをもらうこと。です。
私のC言語に取り組んだ7年間をすべてぶつけたつもりでテキストを作りました。
私の会社の後輩からは、どんなテキストよりもわかりやすかった!や、
今まで教えてくれていた先輩や、テキストたちが、ちゃんと理解できていないことがわかりました。
と、嬉しいコメントをたくさんもらいました。
そしてなにより、彼らの社内での評価がとても高いということが、私の誇りです。
興味がある方はどうか、下のサイトをみてみてください。
http://mori.eco.to/
よし、NG追加
827 :
デフォルトの名無しさん:2008/01/30(水) 20:22:40
すいません、c言語初心者なのですが以下のプログラムがうまくいかないのですがなんででしょうか?
修正点教えてもらえませんか?
#include<stdio.h>
#include <string.h>
#define STR_SIZE 256
int main(int argc, char *argv[])
{
int cnt;
int pri_cnt;
int n;
int k;
int sort_cnt1;
int sort_cnt2;
char temp[1];
if(argc < 3)
{
printf("\nUsage : %s STRING1 STRING2 [STRING3 ...\n\n",argv[0]);
return 1;
}
printf("\n** String data **");
for(cnt = 1 ; cnt < argc ; cnt++)
{
printf("\n%s",argv[cnt]);
}
printf("\n** Changed string **");
828 :
デフォルトの名無しさん:2008/01/30(水) 20:23:32
for(cnt = 1; cnt < argc ; ++cnt)
{
k = strlen(argv[cnt]);
for(n = 0; n < k ; ++n)
{
argv[cnt][n] = argv[cnt][n] - 0x20;
}
}
for(sort_cnt1 = 1 ; sort_cnt1 < argc ; sort_cnt1++)
{
for(sort_cnt2 = sort_cnt1+1 ; sort_cnt2 < argc ; sort_cnt2++)
{
if(argv[sort_cnt1] > argv[sort_cnt2])
{
temp = argv[sort_cnt2];
argv[sort_cnt2] = argv[sort_cnt1];
argv[sort_cnt1] = temp;
}
}
}
for(pri_cnt = 0 ; pri_cnt < cnt ; pri_cnt++)
{
printf("\n%s",argv[pri_cnt]);
}
return 0;
}
>>827 そのプログラムの目的と、どううまくいかないのかくらい書け。
>>829 お前もだ。
取り敢えず、C++ならstring.hではなくcstringをインクルードしとけ。
strの文字数は、その場合は自分で256に決めずにコンパイラに任せておけ。
流れを説明し易いように、iなんて変数名でカウントするのはやめておけ。
ptrを初期化しないで後から代入しているが、宣言時に初期化してしまえ。
「g++43でコンパイルできないんだけど、どう修正したら
いいの?」とかいう質問はここでいいんでしょうか?
いいよ
もしソースが長いなら直接貼らずにどっかうpれ
>>831 他のコンパイラでコンパイルできると言うのなら、g++の問題だろうからgccスレがいいんじゃね?
そうじゃなくて、たまたま使ったのがg++だと言うのなら、ここでもいいと思うけど。
>>833 「他のコンパイラ」のほうの問題かもしれないだろ
C++だとそういうケースがよくある
因みにg++41では問題ないです。
http://gcc.gnu.org/ml/gcc-patches/2007-06/msg01075.html g++の変更の論拠がここに書いてあるな。標準の7.1.1-1を見ると確かにエラーが正しいように見える
回避策は、
1. 単に32行目のstaticを削除する
これでg++-4.3ではちゃんとstatic扱いになるはずだけど、g++-4.2だとそうならないので複数定義エラーになる
2. lexical_cast自体を非staticにする
別にこれをstaticにする理由はないと思うので、20行目と32行目のstaticを削る
この場合、特殊化をヘッダに置いたままにしておくと複数定義になってまずいので、
ヘッダには宣言だけにして定義をparam.cppに移すか、あるいは単にinlineを付けるのでもいい
3. lexical_castを削除する
grepしてみたら使われてないようなので
>>837 何だか32行目のstaticを外す方向がいい気がするけど
(何で lexical_castがstatic扱いなのか今のところ良く分からない
ので)
そうすると確かにg++43ではコンパイルが通りますがg++41では
多重定義だといってはねられますね...
lexical_cast自体はparam.hの後の方で使われているっぽいです。
1.か2,かの方向で検討してみます。有難うございました。
>>838 >lexical_cast自体はparam.hの後の方で使われているっぽいです。
見逃がしてた、ありがとう
でも非staticテンプレートからstatic関数を参照するのはODR違反のような気がする
lexical_castを非staticにするのが良いかと思う
char *p[10];
みたいなことをしたいのですが
どうすればいいでしょうか?
>>840 それで正しい宣言になってる(pはchar *の配列)けど、何をしたいんだ?
842 :
840:2008/02/05(火) 11:02:37
>>841 ありがとうございます。
windowsプログラミングでエディットボックスの中身を
複数保存できるようにしたかったのでこのようなことが
できるかわからなかったので質問させていただきました。
843 :
デフォルトの名無しさん:2008/02/15(金) 17:21:49
メモリを確保し、
char *buf = (char *)calloc((int)dwSize+1,sizeof(char));
そこに、abcdefという文字列を入れます。
cの部分のみを読み取り、それがcであるか否かの判定をしたいのですが、
どうすれば出来ますでしょうか?
if(buf[2] == 'c') ...
こういうこと?
for(int i=0; i<=100; i++)
と
for(int i=0; i<=100; ++i)
の結果が違わないのは何故でしょうか
>>845 i++と++iは同じ副作用を持つから。
この二つの式は違う値をもつ(前者ならインクリメント前のもの、後者は後のもの)けど、
for文の三番目の式は、副作用だけ利用されて値は捨てられるから、この違いが現れない
847 :
デフォルトの名無しさん:2008/02/15(金) 18:41:19
ありがとうございます。
>>843です。
abcdefからbcを見つけ出しeまで抽出したいのですが、
どうすれば出来ますでしょうか?
>>847 char * pbc = strstr(buf, "bc");
if (pbc == NULL) ...; // not found.
char * pe = strchr(pbc, 'e');
if (pe == NULL) ...; // not found.
char newBuf[pe - pbc + 1 + 1];
sprintf(newBuf, "%.*s", pe - pbc + 1, pbc);
>>846 なるほど
後者は0に+1されてからiが代入されて
1からループが始まるのかと思ってました
ありがとうございました
850 :
デフォルトの名無しさん:2008/02/16(土) 00:29:08
本当にありがとうございます。
解決しました。
buf[2]のみをダイアログ上のエディットコントロールに対し、
SendDlgItemMessageを使い書き込みたいのですが
出来ません。
どうすれば出来ますでしょうか?
>>850 「ありがとう」と言われても、あんたが何者なのか誰も知らんから誰にも伝わらんぞ。
で、3行目以降についてもいきなり書かれても何のことやら判らん。
状況説明もできないのなら、なにもできるわけないだろ。
852 :
デフォルトの名無しさん:2008/02/16(土) 02:24:07
状況説明
SendDlgItemMessageでエディットコントロールにbuf[2]を送ったが
エディットコントロールに文字列が追加されない。
・環境は?
・buf[2]ってなに?
・SendDlgItemMessageをどう使って送ったの?
・あんた馬鹿?
854 :
デフォルトの名無しさん:2008/02/16(土) 03:59:08
実際のコードを貼らない質問者なんてスルーでいいべさ。
856 :
デフォルトの名無しさん:2008/02/16(土) 15:17:30
わかりました。
簡略化したコード
char *buf = (char *)calloc((int)dwSize,sizeof(char));
↓
ReadFile(hFile,buf,dwSize,&numOFRead,0);//ファイル内容abcde
↓
SendDlgItemMessage(hWndDlg,IDEDIT, EM_REPLACESEL,0,(LPARAM)((LPSTR)buf[2]));
>>856 buf[2]は'c'という文字であって"c"という文字列じゃないから、それは動かない
まず"c"という文字列を用意して、それを渡す
char content[2];
content[0] = buf[2];
content[1] = '\0';
SendDlgItemMessage(hWndDlg, IDEDIT, EM_REPLACESEL, 0, (LPARAM)content);
SendDlgItemMessageAを使った方が、って書こうと思ったけど、
comctl32.dllバージョン6だと、それはそれで面倒なことになる気がするから、書かないでおく。
皆様へ
ありがとうございます!!
860 :
デフォルトの名無しさん:2008/02/16(土) 16:31:38
csvファイルを読み込んで任意の値で描画する方法を教えてください。
CSVは x,y,value\nで数百行。
二次元配列 M[50][50] ///max
二次元配列 M[X][Y] にcsvのxをX,yをYでセット
二次元配列 M[x][y] にvalueを代入
※x,yはint valueはstr6バイト
forループでM[X][Y]を0,0から49,49までvalueを表示させる。
※空値の場合はカンマをセット
イメージ
aaaba,,,bbbb,,,,,,,,,asdass,,,,・・・
cccdse,,,,,,,,,,,,,,,,,,,,,,,,,,,bnvmde,,・・・
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bredkgalkser,・・・
,・・・
①ファイル読み込み
②x,y,valueセット
③描画
↑
③の描画でvalueが②で最後にセットされた値しか出てきません。
どなたか教えてください。
>>860 丸投げしたいなら宿題スレへ、ヒントが欲しいなら質問箇所を絞って、エスパー希望なら鼬害。
>860=>859なら死ね。
863 :
デフォルトの名無しさん:2008/02/22(金) 22:31:23
C99のinlineがc++のinlineと違うのでむかついた
int array[3] = { 0, 1, 2 };
この配列の
array[3]の中身がNULLというのは保証されていますか?
違いましたらforeachって、どういう中身になっているのか教えてください
array[3]は存在しません
アドレスは取れますが、参照しようとしたり代入しようとすると未定義動作
foreachって何の言語よ?
何の言語でも、array[3]へのアクセスができない言語なら
配列の要素数が3であるということを把握してループしているだろうということは容易に想像できる。
C#じゃねーの?
>>865 C#なら配列の長さを調べることができるから
for (int i = 0; i < array.Length; i++) {
~
}
ってやればいいんじゃね
そもそもarray[3]はポインタじゃないのに何でNULLになるんだよ…
たぶんあちこちでNULL文字とかNULL終端といった言葉が使われてるせいかと
873 :
865:2008/02/23(土) 16:21:31
>>867 3個である事を前提にループさせるんですね
発想が悪かったみたいです。。。
終端ばっかり調べようとしてました
配列のサイズ取得して割ったら出来ました
ありがとうございます
874 :
デフォルトの名無しさん:2008/03/06(木) 22:24:02
サイトからダウンロードしたMicrosoft Windows SDKのIMGファイルが1.32GBもあって大きすぎてCDに入らないんですけどどうやってインストールするんですか??
300行で1つの関数と、それと同等の処理を30行の関数が100個で構成するのとでは何が違うのでしょうか?
スタックがどうのこうのとブツブツ上司が呟いたのだが、なにが問題なのでしょうか
>>874 Daemon ToolsでマウントするとかDVDに焼くとか。
その関数が呼び出されてスタックに詰まれる量が違う
300行分のコードが詰まれるのと
30行分のコードが詰まれるかの違い
けど、其れだけでブツブツ言うとも考えにくいので
他の問題があったのではと予想
明日聞くんだな
>300行分のコードが詰まれるのと
>30行分のコードが詰まれるかの違い
はぁ? コードが詰まれる? どこの実装ですか?
おたくさまの脳内?
881 :
デフォルトの名無しさん:2008/03/08(土) 20:35:29
int *ptr;
int array[10];
for(ptr=array; ptr<array+10; ptr++)
{
*ptr = 0;
}
array+10は何を表しているのですか?
arrayの終端。
>>880 そんな質問の仕方じゃ答えてあげないよ
とりあえず関数作って自動変数のメモリを表示させて確認する作業に戻るんだ
そりゃ自動変数は積まれるだろうよ
コードが積まれるってのは訳分からん
なんだ、>879の阿呆は未だ自分の間違いに気付いていなかったのか。
とっくに尻尾を丸めて引き篭もっているのかと思った。
コードを詰む=スタックに実行アドレス(IP)を詰む
という意味なら通じるが、普通コードを詰むとは表現しないな
んあ?
よくわからない
コードをじゃなくて
「実行アドレスを積む」なら俺リアルで恥かかない・・・?
コードって全体をさしてるものと思ってたんだけど。
処理のみの部分をいうのかな
実際に実行命令をスタックに積んでるわけじゃないから
ほんとはよく知らないんですよ
誰も質問答えないのに見かねてしまった
ごめんね、適当答えて。
まとめると
関数に入ったら
変数はスタックに詰まれる
処理はスタックに詰まれない
てことですね ( 信じるかどうかは貴方次第!
掘り返し875の違いを、ソースを見ずに言える事は、
やはり上司に聞けとしか、言えないですね
>>890 >878は読めないんですか?
特に名前の辺りは。
例えばgooなどでああいう回答してもポイント貰えませんよ
自分はそんな目的ではありませんけども
893 :
デフォルトの名無しさん:2008/03/12(水) 08:20:49
でもコード量が十倍も違うなら、それが一番重要な差異だろ
VC++.NET の質問良いでしょうか?
1.UAC ダイアログを「インストール」ボタン押下時にのみ出したい
1つの EXE でWindowsサービスのインストール、アンインストール、
Windowsサービスの実行の機能を入れたんですが、
VISTA のユーザーアカウント制御機能(UAC)のせいで、
「管理者で実行」でプログラムを立ち上げないと上手く動きません。
フォームの「インストール」ボタンをクリックした時だけ
ユーザーアカウント制御のダイアログを出すように出来ませんか?
常時Admin権限で動作ってのも都合悪いのですが・・・
ユーザーに Admin 権限を持つのユーザー名、パスワードを入れて下さい、
なんて画面を作った所で「???」だろうし
( VISTA インストール時に Admin パスワード入力しませんものねぇ。)
2.Windows サービスの設定ファイル、XXX.ini
ってどこに置けばいいんですか?
VISTA だと users 以下に入っちゃう空気ですが、exe と
同じ位置だとNG?
PC汚染を覚悟の上で windows 以下に入れるのが良い??
教えて君ですがよろしくお願いします。
UAC の情報ねーんですよぉぉぉ!!(絶叫
>>896 1
任意のタイミングで昇格は不可能ではないが、面倒そうなんで、
管理者権限が必要な部分だけ別プロセスにすることを勧める。
2
複数ユーザが同時ログオンしたら破綻するという点で、
Windowsフォルダもアウト、常考。
898 :
デフォルトの名無しさん:2008/06/15(日) 12:50:03
スタックに関してよくみかける記述について1つ疑問。
1)スタックはLIFO(Last In First Out)方式であり
後に入れたデータから先に読みだされる
2)関数の引数及びローカル変数はスタックに積まれる
さて、問題。
int add(int a, int b)
{
int c;
c = b;
c = a+c;
return c;
}
という関数があった場合、スタックにはこのように
データが積まれると考えられる。
変数 c (ローカル変数)
変数 a
変数 b (最後の引数から積まれる)
(スタック領域の先頭アドレス)
1)に従えば、データはc->a->bの順番でしか取り出せない
はずだが、プログラムでは明らかにaより先にbの値を参照
して値を読みだしている。これはスタックのルールに
反するのではないか?
あなたはこの疑問を明確に説明できますか?
>>898 int add(int a,int b);
では、内部的に
struct {
int a,b;
int c;//ローカル変数用
}add_param;
を積んでるんだと考える。
スタックに一度に積めるデータの単位は別に固定じゃない
スタックは抽象概念だからね。
900 :
898:2008/06/15(日) 13:52:30
899さんの考えではint型変数a,b,cを含んだ構造体を一度に
PUSHしたから、取り出すのも同時にPOPできる・・・だから
変数を使用する順番は関係ないのだ、とこういう理屈でしょうか?
そうだとしたら何かおかしくありませんか?
ヒントですが898の日本語の文章はわざと誤解を生じるような
表現が使われています。スタックの本質は、PUSHにしろPOPに
しろ、それは必ずスタックポインタの遷移を伴う操作でなければ
ならないということです。POPするということはスタックから
データを取り除く、つまり”そのデータはもう使わないよ”
という意味ですよね? さて、898で私が書いた"値を参照"
する行為は果たしてPOPでしょうか?
ここをじっくり考えると何が問題だったか見えてくると
思いますよ。
何かおかしくありませんか?と書いてどこがおかしいのか指摘しないのはどうよwww
ともあれ、関数呼びだしに使われるスタックとデータ構造の議論でいうスタックは似ているが別のものってことで
寧ろ、struct {int a, b;}をスタックから取り出していると捉えてもいいかもしれない。
その後の仮引き数やローカル変数がスタックに積まれるかどうかは実装依存だし。
スタックといっても色々あって、pushされたら、popするまで
一切アクセスすることが出来ないものもあれば、アクセスでき
るものもある。
Cの関数の引き数用のスタックは、当然アクセスできるタイプが
使われる。問題はスタックポインタをどうやって関数は知らされたか
だが、まぁ隠しグローバル変数(register属性)とでも思って桶
904 :
898:2008/06/15(日) 14:34:42
>>ともあれ、関数呼びだしに使われるスタックとデータ構造の議論でいうスタックは似ているが別のものってことで
こういう中途半端な理屈で自分を納得させて学習を止めてしまうのが
一番良くありません。疑問があれば納得するまで調査するべきです。
私はCを勉強したての頃に前述の疑問を持ちその理由がよく説明
できませんでした。そこで自分なりに調べた結果、出した結論が
以下の答えです。
1)スタックはLIFO(Last In First Out)方式であり
後に入れたデータから先に読みだされる
という記述の”読みだされる”というのがあたかもPOP
をしたかのように誤解を与える記述ですが、実際は内部の
動作としては”値を読みだす(参照する)行為”は”POP操作”
ではありません。スタックポインタが移動してないからです。
(続く)
905 :
898:2008/06/15(日) 14:35:26
898のスタック構造は若干、はしょった部分があり正確には
関数add()内部でのスタック構造はこんな感じになります。
ebpレジスタ
変数 c (ローカル変数)
関数の戻り先アドレス
変数 a
変数 b (最後の引数から積まれる)
(スタック領域の先頭アドレス)
そして関数内部ではesp(スタックポインタ)を一旦ebpレジスタ
に格納したうえで(アセンブラではmov (ebp,esp) )、変数a,変数b
への参照を以下のように行っています。
変数a dword ptr[ebp+12]
変数b dword ptr[ebp+16]
変数c dword ptr[ebp+4]
add()関数内部の処理はこれらをアキュムレータで演算しているに
過ぎません。
(続く)
906 :
898:2008/06/15(日) 14:37:19
関数を抜けるときに初めてPOPが行われます。
1)変数cをPOP
2)POPで呼び出し元に復帰
3)変数aをPOP
4)変数bをPOP
※実際にはPOPを行わずにスタックポインタの値を進める事で
代用する場合が多いです。
結局、関数の中でスタックに積まれた引数やローカル変数の値
を使用することはスタックからそのデータを取り出した(POPした)
わけではないのだから、スタックの定義と全く矛盾しませんよ
ということを言うためにこんなまわりくどい説明をしました。
でも、案外誤解している人って多いかもしれないと思います。
なお、これらは日経BP社の「プログラムはなぜ動くのか」という
本の第10章「アセンブリ言語からプログラムの本当の姿を知る」
を読めば完全に理解できると思います。
(終)
907 :
898:2008/06/15(日) 14:58:50
>>903 ここはCに関するスレッドなので、スタックの概念や実装についても
Cの範疇でのみ回答しております。
>>904-906 だから、その話を踏まえて「似ているが別のもの」って言ったんだよ
Cの普通の実装で使われる呼び出しスタックは、配列上に構築したスタックと同じで、
スタックポインタからのオフセットを指定することで任意の要素のO(1)読み書きができるけど、
これは「スタック」というデータ構造が元々持ってる機能ではないってこと
基本的な意味でのスタックでは、値を取り出すにはpopするしかない
そこを混同してると
>>898みたいな疑問が生まれる
909 :
898:2008/06/15(日) 15:12:50
あらま、詳しいお方でしたのね。失礼。
つーか、Cの仕様レベルでの話に実装を持ち出す>905はいかがなものかと。
911 :
898:2008/06/15(日) 15:55:18
>>910 正論だ。まったくもって正論だ。
「プログラムはなぜ動くのか」の本にもPentiumなどのx86系
マイクロプロセッサ用アセンブリ言語を対象として解説する
って書いてあった。どんなレジスタが使われるかはコンパイラ
依存だとも・・・。説明不足でした。まあ実装はちょっと置いといた
としても、なぜに「スタック」という名前なのに下のデータにアクセス
できてしまうのかという疑問については解決ってことで...(苦しい)
ポーランド記法で計算を行う為のアルゴリズムを教えてください。
CPUのスタックはスタックポインタいじればどこでもアクセスできるだろ
引数の渡し方も呼び出し規約で変わる
fastcallだとレジスタ渡しだし
914 :
デフォルトの名無しさん:2008/06/16(月) 17:48:41
C#での質問です。
string[] str = new string[10];
char[,] moji = new char[10,30];
このstrにファイルを読み込んで文字列として格納したものを、
mojiにコピーするにはどうしたら良いのでしょうか?
ToCharArray()を使おうと思ったのですが上手くいかずに困っています。
どなたかご鞭撻の程宜しくお願いします。
ここがC#のスレッドに見えたんだろうか。
>>915 >>1を見ればC#スレにしか見えないだろ。
>>914 ジャグ配列で良ければ、ToCharArrayが使える。
矩形のchar[,]でないといけないなら、自分でループ回す方法しか俺には思い浮かばない。
char[][] moji = new char[str.Length][]; //別にnew char[10][]でも
for (int i = 0; i < str.Length; i++)
{
moji[i] = str[i].ToCharArray();
}
917 :
914:2008/06/17(火) 09:18:37
>>916さん
わざわざお答え頂きありがとうございます。
なるほど、出来なかった理由は宣言の時点での間違えだったのですね。
大変助かりました。
918 :
914:2008/06/17(火) 17:11:58
連投してすみません;
914の者ですが
配列mojiにstring型の文字列を格納することは出来たのですが、
もう一つmojiと同じ方の多次元配列を用意して、
それにmojiをコピーしたいのですが上手くいきません;
Array.Copyなどを使えば動作はするのですが、配列の中身が変わっておらず
どうすればいいのか分かりません。
度々すみませんが、宜しくお願いします。
>>917 いいえ、「間違え」ではありません、「間違い」です。
920 :
914と918:2008/06/18(水) 16:53:48
918のものですが自己解決しました。
お騒がせしてしまい、すみません;
>>919 おぉ、確かに間違えてる;
ご指摘どうも。
すみません初心者です。
ポインタと配列のところで参ってしまってるんですが・・・
本に拠ると int test[5]; で、test = &test[0]; というのはなんとなく理解できたんですが、
仮に ans = avg(test); のtestを参照渡ししたとして、渡されたパラメーターがdouble avg(int t[]){の様に、
int型の配列に参照渡しされているんですが・・・
test = &test[0]; というのはアドレスにも関わらず、
int型の配列に参照渡しが可能な理由というのはなんなのでしょうか?
配列にはアドレスを参照渡しできると考えていいんでしょうか?
返信宜しくお願いします。
>>921 int t[] の側が int* t の意味に近い。
細かいところで微妙に挙動が違うんだけども。
923 :
921:2008/06/19(木) 23:15:16
>>922 レスありがとうございます。
パラメータを int* t とする様なサンプルは、
本の次のページにもろに載っているんです。
だから、違いが分からなくて・・・
int* t ならば理解できるんですが、もう少し御説明できませんか?
925 :
921:2008/06/19(木) 23:26:45
>>924 じっくり読んでみます。ありがとうございました。
%dや%fなどのような書式指定子で、絶対値にする書式指定子ってありますか?
>>923 関数の引数に限って言えば *testもtest[ ] もまったく同じ
>>926 ライブラリ関数に値を絶対値にして返す奴があるから
それ使って絶対値に直すといい
たまにはabs()の事も思い出して上げてください
すみません。いくつか質問があります。
#include <stdio.h>
#include <stdlib.h>
int main (void){
char *str;
int num,i;
printf("何文字のaを用意しますか?\n");
scanf("%d",&num);
str = (char *) malloc (sizeof(char) * (num + 1));
if(! str){
printf("メモリが確保できませんでした。\n");
return 1;
}
for(i=0;i<num;i++)
*(str + i) = 'a';
*(str + num) = '\0';
printf("%sを用意しました。\n",str);
free(str);
return 0;
}
1:str = (char *) malloc (sizeof(char) * (num + 1));の所なんですが、
(char *) はmallocをキャストしているということなんでしょうか?
2: (sizeof(char) * (num + 1)); の*は、(num + 1)のポインタなのでしょうか?
3:本に *(str + i) = 'a'; はポインタを使って配列に格納すると書いてあるのですが、
どういうことなのでしょうか?
宜しくお願いします。
932 :
931:2008/06/21(土) 02:21:37
(sizeof(char) * (num + 1)); の*ってもしかして掛け算!?
933 :
デフォルトの名無しさん:2008/06/21(土) 03:40:53
>>932 正解。
(char型のサイズ)x(num+1)分の領域を確保しようとしてる
>>931 1. mallocの戻り値は void* 型なので str の型である char* 型にキャストしている
Cでは void* 型からのキャストは自動的に行われるのでキャストしなくてもエラーにはならない。
C++ではないとエラーになるがC++では new を使うのが一般的。
2.
>>932の通り
3.式の先頭にある * はポインタ。式の途中にある * は乗算の演算子。
配列への格納は str[ i ] = 'a' のようにするがこれをポインタを使って*(str + i) = 'a' と書くことも出来る。
935 :
931:2008/06/21(土) 12:56:54
int main(int argc,char **argv)
ってmain関数があるんですが、これは標準入力で入れられた配列の文字列の個数(int argc)とその配列の先頭のアドレス(**argv)が引数ってことですか?
**argvと*argv[]は同じことなんでしょうか
>>936 標準入力で入れられた配列じゃなくて、起動時に与えられたコマンドライン引数の配列の
要素数(argc)と先頭要素へのポインタ(argv)
>**argvと*argv[]は同じことなんでしょうか
int main(int argc, char **argv) {...
と
int main(int argc, char *argv[]) {...
が同じかという質問なら、同じ
関数引数の宣言では、配列を宣言してもポインタを宣言したのと同じことになる
構造体の初期化についてなんですが
struct papa{
int number; int mama_number;
}
struct papa menber[5000];
for(i=0;i<5000;i++){
menber[i]={i,i};
}
とはできないんですか?
C99ならできた気もするけど、C89ではできない
初期化と代入は別のもの
ありがとうございます。
ということは一個ずつ代入を書いていくしかないんですか?
そういうこと
もちろん、こういう代入が複数箇所で必要なら関数にまとめることはできる
>>939 C++なら(構文は違うけど)できるよ。
944 :
939:2008/07/07(月) 22:36:47
ありがとうございました。
C++スレで聞きます。
945 :
デフォルトの名無しさん:2008/07/08(火) 23:03:53
↓こんなプログラムを作りたいのですがどうやってつくったらいいのでしょうか?
挿入元文字列 : パソコン
挿入文字列 : デスクトップ ←scanfで任意に入力
 ̄ ̄ ̄ ̄ ̄ ̄ ̄
挿入位置 : 2 ←scanfで任意に入力
 ̄
挿入結果 : パソデスクトップコン
配列を駆使して作りたいです、教えてください
たぶん多重ループを用いると思うんですが
そこまでロジックを書き出せてるなら、もうその通りに書くだけだよがんばれ
もっと文字列処理が簡単な言語を使うのがいいと思うよ。
948 :
質問です。(1/2):2008/07/10(木) 10:37:06
質問です。標準入力からgzipにデータを渡し、標準出力から圧縮/解凍データを得ようと思っていますが、
パイプ通信が上手く行きません。一体どうやったら上手く行くでしょうか?環境はLinux+gccです。
int pid;
int pipe_pc[2];
int pipe_cp[2];
int size;
pipe(pipe_pc);
pipe(pipe_cp);
pid = fork();
if(pid > 0)
{
close(pipe_pc[0]);
close(pipe_cp[1]);
size = write(pipe_pc[1],src,src_size);
*p_comp_size = read(pipe_cp[0],comp,100);
fprintf(stderr,"[%d / %d]\n",*p_comp_size,src_size);
sleep(10);
exit(1);
}
949 :
質問です。(2/2)ソース続き:2008/07/10(木) 10:39:15
>>949の
execl("gzip","gzip","-f",NULL);
は
execl("/bin/gzip","gzip","-f",NULL);
と絶対パスでないと実行されないことが分かりましたが、
それでも標準入力(read関数で送ったもの)が読み込まれていない様子です。
何が悪いんでしょうか??
>>950 訂正:read関数で送ったもの→write関数で送ったもの
>>951 なんでいきなりgzipなんて難しいものに挑戦するかな。
取り敢えず、cat -nかteeでも動かしてみればいいじゃん。
後者なら、標準入力を標準出力に流すときにファイルにも落としてくれるからデバッグが楽になるよ。
>>952 本来の目的はバッファデータを圧縮・解凍して、バッファに受け取ることです。
ただし即時性が求められるのでファイルに一度書き出さずに行いたいのです。
アーカイバの標準入力へ渡し、標準出力で受け取ることがしたいのですが、
どうしても上手く行きません。。。
どなたか似たようなことをやったことのある人いないでしょうか?
>>952 あのさぁ、いきなりgzipで本番プログラムを作らなければいけないって掟でもあるの?
まずはcat -nかteeで実験してみて巧くいったらgzipを試せばいいじゃん。
それはさておき、圧縮に即時性を云々する段階で何かおかしいと気づくべきだって気もするが。
なんでzlib使わないんだろ。
解答どうもありがとうございます,zlibなんていう便利なものがあったのですね.
簡単にできてしまいました;^^)
どうもあろがとうございました
配列に関数の戻り値を入れようとして
hairetu[2]={f(5),f(3)};
とやってもコンパイルできません。
なにかいい方法はありますか?
957 :
956:2008/07/11(金) 08:26:09
すいません。
グローバルで初期化していたためできないだけでしTA
質問です。
typedef struct{
int year;
int month;
int day;
}Tdate;
int check(Tdate *);
下のint check(Tdate *); は関数のプロトタイプ宣言なんですが、これは何を引数にしているんですか?
Tdate構造体タグのポインタを引数にしているのでしょうか?
Tdateへのポインタを引数にしている
Tdateはタグの無い構造体ね
では、関数を呼び出す時は
check(&Tdate)
としてTdateのアドレスを渡せばいいんですか?
Tdateは値じゃなくて型だからポインタは取れない
例えばTdate型の変数xがあるなら、
check(&x)
みたいに呼び出す
int check(Tdate *);
このプロトタイプ宣言は、いつからOKになったの?
C99?
C89だろ
965 :
963:2008/07/18(金) 14:42:13
typedefを見落としてた・・・orz
ワスレテクレ
質問です
int型(void型以外)の関数がreturn無しで抜けた場合に、スタック領域をぶっ壊す可能性は有るのでしょうか?
こんな関数
int hoge()
{
:
略
:
}
return無しで呼び出し元に戻る
通常、壊れません。
だからと言って、やっていいわけではない。
ソースファイルhoge1.c内でグローバル変数 char g_hoge[64]を定義、
ソースファイルhoge2.c内でグローバル変数 char g_hoge[128]を定義、
hoge1.cには関数 int hoge1()が、hoge2.cには関数int hoge2()が定義されていて
それぞれの関数内で各変数のサイズ分フルにデータをぶち込んでいるとした上で
meinからhoge1()、hoge2()の順に呼び出した場合のグローバル変数g_hogeの扱い(アドレス管理等)って
どうなっているのでしょうか?
今確認出来ている事象としてhoge2()内でmemsetでゼロクリアすると落ちたり、
hoge1、hoge2を抜けたあとで関係の無い関数を呼び出した瞬間に落ちたりしています。
gdbでそれぞれの関数内でg_hogeのアドレスを見ると同じアドレスを指しています
頭の悪そうなコーディングと御思いでしょうが、4,5年商用で稼動しているモノだけにヘタに対処できないんですorz
関数3つ程追加した途端に時限爆弾が作動したみたいです
971 :
デフォルトの名無しさん:2008/08/06(水) 01:04:06
hoge
今日、この関数がエントリポイントになってて、
呼び出し側は複数のモジュールのエントリポイントのリストを見に行って
勝手に呼び出すようになっているという説明を受けた。
こういうプログラム書いたことある人いますか?
もっともエントリポイントも初めて聞く言葉だったんで
よくわかってないですが。
>>972 特定のI/Fを持った関数を、ある関数群のエントリポイントと呼ぶ。
その関数を呼び出し元が適宜呼ぶから、その先は勝手に作れって話じゃないかと。
言い方を変えると関数のポインタを使って云々ってこと?
>>973 、4
レスありがと。
関数ポインタは使ってなかったね。
モジュール名とIDがかかれてたが、具体的にどう実装されているのか
Cをシンプルにしか使ってこなかったオレにはさっぱりでした。
win プログラミングでdll 作るときなどでエントリーポイントつくるようで
調べてみたけど同じようなものなのかなぁ。
もっと深いところを追わないとダメだということだけはわかったけど。
>>970 >ソースファイルhoge1.c内でグローバル変数 char g_hoge[64]を定義、
>ソースファイルhoge2.c内でグローバル変数 char g_hoge[128]を定義、
言語仕様所上はこの時点で挙動が未定義
gccだとエラーにしないで同じオブジェクトを参照させるみたいだな
そのオブジェクトがchar[64]なのかchar[128]なのかは
リンク後のファイルにobjdump -tすれば分かるはず
977 :
デフォルトの名無しさん:2008/08/07(木) 19:44:31
3次元空間上にある2つの単位ベクトルAとBがあります.
BはZ軸方向単位ベクトルです.
B→AまたはA→Bに回転して一致する回転角度を求めたいのですが
この際にX軸方向,Y軸方向,Z軸方向回転角度として求めたいです.
atan2を使うと,ある軸成分が0の場合には発散したり,回転してないことになってしまいます.
これを回避して組むにはどうすれば良いでしょうか?
>>977 ややスレチな気がするがAベクトルをBベクトルに一致させる回転行列がほしいって事か?
979 :
デフォルトの名無しさん:2008/08/07(木) 21:59:03
>>978 すれ違いな気もしますがそのとおりです.
オイラー角だとAとBが一致している場合挫折しちゃったので・・・・
数学板にいくと実装の話しまで行かないし・・・
まあ、オイラー角使うなってこった。
回転軸のベクトルと回転角(か、クオータニオン)で指定する方が無難。
981 :
デフォルトの名無しさん:2008/08/08(金) 09:55:51
AとBの外積を求める(→回転軸)
↓
AとBの内積から角度を求める(→回転角度)
↓
回転軸まわりに回転角度だけ回転
回転軸まわりに回転角度だけ回転するような変換行列があればそれだけのことなんでしょうか?
982 :
デフォルトの名無しさん:2008/08/08(金) 18:15:49
>>981 そう。
ただ、そのやり方でも A == B の時は結果狂う。
A == B の時は条件分岐で単位行列にしとけ。
回転軸を (x, y, z)、回転角を a として、
(cos a, x sin a, y sin a, z sin a) の形でデータを持つのがクオータニオン。