C言語なら俺に聞け(入門篇) Part 22

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 21
http://pc11.2ch.net/test/read.cgi/tech/1194384258/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 100
http://pc11.2ch.net/test/read.cgi/tech/1195668114/
2デフォルトの名無しさん:2007/12/01(土) 15:12:15
3デフォルトの名無しさん:2007/12/01(土) 15:36:24
過去スレのアドレスって意味があるのか?
4デフォルトの名無しさん:2007/12/01(土) 15:39:28
見ようと思えば見れる人がいる以上、無意味とは言えない
5デフォルトの名無しさん:2007/12/01(土) 20:55:35
●が無くても見ようと思えば結構見れるもんさ
http://www.geocities.jp/mirrorhenkan/
6デフォルトの名無しさん:2007/12/01(土) 23:24:46
つかプログラム中でpwdで 現在のディレクトリの場所確認して
そこのファイルを指定することできる?
7デフォルトの名無しさん:2007/12/01(土) 23:31:23
>>6

pwd、ってことはUNIX?
環境変数を取って来る関数がある。getenv()だったか。
それで環境変数PWDの値をとってくればいい。
8デフォルトの名無しさん:2007/12/01(土) 23:50:26
スレ違いなら、すみません
専用スレで答えてもらえなかったので・・・・とにかく困っています

Dim ti As Integer

Private Sub Command1_Click()
Image1.Visible = True
Timer1.Enabled = True
Text1.Text = Time
ti = 0
Text2.Text = ""
Text3.Text = ""

End Sub
Private Sub Command2_Click()
Text2.Text = Time
Text3.Text = Str(ti)
Timer1.Enabled = False
Image1.Visible = False

End Sub

9デフォルトの名無しさん:2007/12/01(土) 23:50:58
Private Sub Command3_Click()
End
End Sub

Private Sub Text1_Change()

End Sub

Private Sub Timer1_Timer()
ti = ti + 1
End Sub

質問ですが、このソースでクリア(空白?)の
>>Text2.Text = ""
Text3.Text = ""
等は書いても書かなくてもいいのでしょうか?
10デフォルトの名無しさん:2007/12/01(土) 23:56:06
1th/sports/part1/*
1th/sports/part2/*
1th/work/part1/*
1th/work/part2/*
2th/sports/part1/*
2th/sports/part2/*
2th/work/part1/*
2th/work/part2/*
みたいに8個くらいの別のディレクトリに入ってるファイルに対して
同じプログラムをかけないといけない場合どうしますか?
どういう風に実行していきます?

ルートディレクトリから指定したらそのパソコンでしか使えないでしょ。
11デフォルトの名無しさん:2007/12/02(日) 00:09:41
>>6>>7 getcwd(3)
12デフォルトの名無しさん:2007/12/02(日) 10:07:02
>>10
日本語でおk
13デフォルトの名無しさん:2007/12/02(日) 12:09:12
>>10
前半と後半のつながりがさっぱりわからんが

const char* path[] =
{
 "1st/"
 "2nd/"
};

for (i = 0; i < sizeof(path) / sizeof(path[0]); i++) {
 /* path[i] について処理 */
}

>ルートディレクトリから指定したらそのパソコンでしか使えないでしょ。
相対パスで指定するかユーザに指定してもらえば?
14デフォルトの名無しさん:2007/12/02(日) 14:43:58
書き手が居ないのこっちで募集してみる

新ジャンル『アルゴリズム女』
http://yutori.2ch.net/test/read.cgi/news4vip/1196506706/

サンプル、稚拙でスマン
/*------------------------------------------------------------------------------*/
男「御昼何食べる?」
女「:end; if ( FALSE == errlavele ) { GOTO step1; } else { GOTO step2; } 」
男「スパゲッティでいいか?」

/*------------------------------------------------------------------------------*/
女「while ( sub() ) { sex(); sex(); sex(); sex(); sex(); sex(); }」
男「くはっこのスキモノめ、オレ体力もつかな♪」



女「sub(){ exit(-1); } 」
15デフォルトの名無しさん:2007/12/02(日) 17:15:54
>>14
うん、すれ違いだね
16デフォルトの名無しさん:2007/12/02(日) 19:28:26
enumって「イーナム」と読むと思ってたのに、「エナム」なんだ?
17デフォルトの名無しさん:2007/12/02(日) 19:30:22
>>16 にぴったりのスレがあるよ

情報処理用語の読み方を確認するスレ
http://pc11.2ch.net/test/read.cgi/tech/1056173956/
18デフォルトの名無しさん:2007/12/02(日) 19:31:13
C言語の中で他のexeファイルを実行するやり方を教えてください。
19デフォルトの名無しさん:2007/12/02(日) 19:36:04
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct card{int face;int suit;};
typedef struct card Card;
void fillDeck(Card *,char *[],char *[]);
void shuffle(Card *);
void deal(Card *,char *[],char *[]);
main()
{
Card deck[52];
char *face[]={"2","3","4","5","6","7","8","9","10","ジャック","クィーン","キング","エース"};
char *suit[]={"ダイヤ","クラブ","ハート","スペード"};
srand(time(NULL));
fillDeck(deck,face,suit);
shuffle(deck);
deal(deck,face,suit);
return 0;
}
20デフォルトの名無しさん:2007/12/02(日) 19:36:45
>>19の続き
void fillDeck(Card *wDeck,char *wFace[],char *wSuit[])
{
int i;
for(i=0;i<=51;i++)
{
wDeck[i].face=i%13;
wDeck[i].suit=i/13;
}
}
void shuffle(Card *wDeck)
{省略}
void deal(Card *wDeck, char *face[], char *suit[])
{省略}
参考書には、関数fillDeckで配列の初期化を行っていると書いてあるのですが、
具体的な操作の説明が書いてなく困っています。
誰か分かる方、説明お願いします。
21デフォルトの名無しさん:2007/12/02(日) 19:38:16
>>18
system関数
22デフォルトの名無しさん:2007/12/02(日) 19:39:51
>>20
>for(i=0;i<=51;i++)
>{
>wDeck[i].face=i%13;
>wDeck[i].suit=i/13;
>}

見たまんまじゃん。
どこがわからんの。
23デフォルトの名無しさん:2007/12/02(日) 19:40:21
何がわからないのかこっちが聞きたいくらいだよ
24デフォルトの名無しさん:2007/12/02(日) 19:41:41
>>21
ありがとうございます。
25デフォルトの名無しさん:2007/12/02(日) 19:45:03
>>17
どうもありがとう。
26デフォルトの名無しさん:2007/12/02(日) 19:59:06
char a[] = "4294967295";
を数字4294967295に変換できる関数はないでしょうか。
atoiではできませんでした。
27デフォルトの名無しさん:2007/12/02(日) 20:00:21
int i;
int *heap;
heap = (int *)malloc(sizeof(int) * 10);


こういう例題があるんですが、
(int)はキャスト変換で、(int)の右の値をint型に変換しているんだとして、
(int *)と、*がついているのは何故ですか?
28デフォルトの名無しさん:2007/12/02(日) 20:03:30
int *型に変換してるから。
29デフォルトの名無しさん:2007/12/02(日) 20:06:56
>>26
int は -2147483647〜2147483647 なので、4294967295 は表現できないから無理
30デフォルトの名無しさん:2007/12/02(日) 20:12:40
>>26
strtolとかsscanfでlongにするとか
31デフォルトの名無しさん:2007/12/02(日) 20:15:35
>>27

(int)はキャストじゃなくて、sizeof(int)の一部。
sizeof()で演算子になってて、()内の物のサイズを計算する。
sizeof(int)だと、int型のサイズ。
32デフォルトの名無しさん:2007/12/02(日) 20:17:40
32ビット環境だとlongでも32ビットか。うっかりしてた。
33デフォルトの名無しさん:2007/12/02(日) 20:20:33
a long long int...
34デフォルトの名無しさん:2007/12/02(日) 20:24:07
strtollだな
35デフォルトの名無しさん:2007/12/02(日) 20:33:06
>>28
int *型とは??
ポインタ型変数とは、int型の普通の変数のアドレスを持っている変数
って意味ではないんでしょうか?
>>31
すみません。多分、誤解だと思うのですが、私が言っているのは、
(int *)malloc
の、 ↑この部分の * のことです。分かり辛くてすみません!!
3626:2007/12/02(日) 20:39:00
>>30さんできましたどうもありがとうございます
#include <stdio.h>
int main ()
{
char a[]= "4294967295";
unsigned int b;
sscanf(a,"%lu",&b);
printf("%lu",b);
return 0;
}
37デフォルトの名無しさん:2007/12/02(日) 20:43:04
>>35
うーん・・・。
intポインタは「intを指すポインタですよ」ってだけ。
*intでアドレス先のデータをintとして処理する。

だからmalloc(sizeof(int) * 10)で確保した領域を
int *ですと教えないとintとして使えない。
(int *)にキャストする事によって
(*heap)や*(heap+1)やheap[2]という形でint配列としてアクセスできる。
38デフォルトの名無しさん:2007/12/02(日) 20:46:29
>>35
void *型を理解しましょう。
39デフォルトの名無しさん:2007/12/02(日) 20:56:52
>>37
む、難しい・・・
*(heap+1)はどういう意味ですか?
>>38
そこが肝ですね!分かりました。
4026:2007/12/02(日) 20:57:51
>>29
どうもありがとうございます
>>34
borlandなので?strtollはつかえなかったです。
strtolはlongintまでなのでできませんでした。
>>33
long long int?はよくわからなかったんですがコンパイルできませんでした。

ところで
char a[] ="4294967295";
if(strcmp(a,"2147483647") > 0){
800000以上の処理;}
else{
atoiで変換;}
といったコードは数字を正しくできるんでしょうか。
strcmpが文字コードなので期待しているとうりに使えるかどうかがわかりません。
41デフォルトの名無しさん:2007/12/02(日) 21:10:23
>>39
heap[1]
42デフォルトの名無しさん:2007/12/02(日) 21:18:50
malloc()のキャストはK&R時代の古い書き方だと思うが。
C89以降は暗黙的に型変換されるのでキャスト不要のはず。
43デフォルトの名無しさん:2007/12/02(日) 21:19:14
>>40
桁数が同じならうまく行くだろう
44デフォルトの名無しさん:2007/12/02(日) 21:21:18
C言語による台形法のプログラムを作ったのですが、結果がうまく出ません
そうゆう場合の質問はこちらでよろしいのでしょうか?
45デフォルトの名無しさん:2007/12/02(日) 21:23:23
親切な奴が居合わせれば見てくれるんじゃね?
46デフォルトの名無しさん:2007/12/02(日) 21:29:35
>>40
桁数が同じならいける場合があるけど違うならダメ
47デフォルトの名無しさん:2007/12/02(日) 21:29:53
double integ(double a , double b , int n)//積分区間1、積分区間2、分割数
{
int i;
double s,xl,xr,dx;
s=0,0; //積分区間の面積の総和
dx=(b-a)/(double)n; //分割区間の長さ
for(i=0;i<n;++i){
xl = a + dx * (double)i; //y[n]のx座標
xr = xl + dx;  //y[n+1]のx座標
s = s + (fn(xl)+fn(xr)) * dx / 2.0; // (上底+下底)*高さ/2
}
return(s);
}
計算部分のみ載せました。変なとこあったらご指導お願いします
48デフォルトの名無しさん:2007/12/02(日) 21:36:08
>>47
x^2積分したら0.33なったぞ。
どんな問題があるのか説明すれ
4926:2007/12/02(日) 21:36:25
>>43>>40
ありがとうござます。
たしかに桁が違うとだめでした。

50デフォルトの名無しさん:2007/12/02(日) 21:37:25
>>47
intとdoubleの間の算術演算はdouble精度で行われるから、キャストいらんよ
5126:2007/12/02(日) 21:37:49
まちがえた。
>>46
どうもです。
52デフォルトの名無しさん:2007/12/02(日) 21:38:31
>>47
xlに代入する値が間違ってる希ガス
5352:2007/12/02(日) 21:41:27
ごめん、嘘ついた
特におかしいところは無い気がするんだが…
54デフォルトの名無しさん:2007/12/02(日) 21:46:14
>>48
すみません、説明足らずでしたm(_ _)m
私は積分区間0〜1、fn=4*sqrt(1-x*x) で分割数を変えて誤差を測りながら実行してみたんです(積分計算すれば結果はπ)
本来なら分割数を倍するごとに誤差は1/4ずつ小さくなるのですが、私の場合綺麗に1/3ずつ小さくなってってしまうのです
-1.14159 -0.40954 -0.14648 -0.05177... といった具合に
それで、台形法のプログラム自体に手落ちがあるのではないのかとこちらに相談しに来た次第です
55デフォルトの名無しさん:2007/12/02(日) 21:47:07
Borland C++Compilerがほしいのですが、さすがにこの情報漏洩の時代、会員登録はしたくありません。
どなたか.zipでください。
56デフォルトの名無しさん:2007/12/02(日) 21:49:38
>>55
誰にも身分を明かさぬまま、スパイのごとく一生を送るといいよ。
57デフォルトの名無しさん:2007/12/02(日) 21:50:48
>>50
ありがとうございます。修正しておきます

>>52
私も何度も見直したのですが、何が駄目なのかさっぱりです(T_T)
58デフォルトの名無しさん:2007/12/02(日) 21:51:00
逆に、BCC以外のコンパイラを使うって発想はないのか?
5957:2007/12/02(日) 21:57:17
プログラムにミスはないみたいですね・・・
そろそろスレ違いになるので数学板のほうでも覗いてきます
答えてくださった方々、ありがとうございましたm(_ _)m
60デフォルトの名無しさん:2007/12/02(日) 21:58:03
なんか入門書とかについてくるらしいのでそっちの使うことにします。
61デフォルトの名無しさん:2007/12/02(日) 21:58:54
>>54
代数で計算してみればいいけど、それで正しいよ。
62デフォルトの名無しさん:2007/12/02(日) 22:20:40
#include<stdio.h>
int main(void)
{
int i,j,k,data1[10],data2[10];
int *p1;
int *p2;
printf("入力された文字を表示するプログラム\n");
printf("10個の文字を入力してください\n");
p1=data1;
for(i=0;i<=9;i++){
scanf("%d",&p1);
p1++;
} /*ここまでで10個の数字を入力した*/
/*ここからは10個の数字のうちの奇数とそれ以外を区分する関数*/

for(i=0;i<=9;i++){
p1--;
}

for(i=0;i<=9;i++){
printf("%d\n",p1);
p1++;
}

return 0;

}

入力された文字をポインタを使って表示させたいんですが、
このままだと、表示されずに違う数字が表示されてしまうのですが・・・
違いの指摘、よろしくおねがいします。
63デフォルトの名無しさん:2007/12/02(日) 22:23:26
>>62
たぶんこう

×scanf("%d",&p1);
○scanf("%d",p1);

×printf("%d\n",p1);
○printf("%d\n",*p1);
64デフォルトの名無しさん:2007/12/02(日) 22:26:05
>>63
ありがとうございます!うまく通ってくれました!
よろしければ、なぜそのようにしたら通ったのか教えてくれませんか?
65デフォルトの名無しさん:2007/12/02(日) 22:31:51
scanfには変数のアドレスを渡すが、p1はすでにアドレスなのでそれ以上&を付けない

printfの方は、*を付けなかったらアドレスを表示するだけ
p1の指す先を見る場合は*p1
66デフォルトの名無しさん:2007/12/02(日) 22:40:44
ありがとうございます!本当に助かりました、
ポインタのこの部分がずっとわからなくて今日なんとか克服しようと
頑張っていましたが、やはりつまってしまいました。
わかりやすい説明のおかげでスッキリしました。
本当にありがとうございます。
67デフォルトの名無しさん:2007/12/02(日) 23:04:03
まぁそこらへんのポインタの理解が第一の難関だろうね
6819-20:2007/12/02(日) 23:06:57
>>22-23
うわー・・・事故解決しました・・・
理解した瞬間、今までの自分が理解出来なくなりました;;
スッキリしたのでmapionで遊んできます。
レスサンクスでした。
またそのうち来ます。
69デフォルトの名無しさん:2007/12/02(日) 23:40:01
セグメンテーションエラーとか構文エラーは最近ここちいいんだけど
nanとかinfとかでるエラー一番きらい。
70デフォルトの名無しさん:2007/12/02(日) 23:48:14
お聞きしたいんですが、

キーボードから2つの整数を読み込み〜
ってのと、

キーボードから整数を二つ入力し、変数a,bに格納する。

って、同じことですか??
71デフォルトの名無しさん:2007/12/02(日) 23:51:06
うん
72デフォルトの名無しさん:2007/12/02(日) 23:51:35
>>70
まあ同じ
73デフォルトの名無しさん:2007/12/02(日) 23:52:44
>>71
>>72
ありがとうございます。
74デフォルトの名無しさん:2007/12/02(日) 23:53:33
もし違うとしたら…
75デフォルトの名無しさん:2007/12/03(月) 00:17:00
ものすごく初歩的な質問なのですが
先日、やさしいC++〜まずは「C言語」からはじめよう!!〜という本を買いました
本書のP22の¥にC言語を用いての文字の表示について書かれていて

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
printf("test\n");
system("PAUSE");
return 0;
}

・・・と、付属のソフト(Dev-C++)へ入力すると
コマンドプロンプトで「test」と表示されるそうなのですが
「Projest is not compiled」と表示され、なぜか出来ません。

本書に書かれているありがちなミスの例には
・「;」が「:」になっていませんか?
・「半角」で入力されていますか?
・入力場所は合っていますか?
といったものが挙げられているため、上記について何度も確認をしてみたのですがそれらしいミスは自分には見つけることが出来ませんでした。

私一人では解決できそうに無いので、どなたかお力を貸していただけるとありがたいです。
76デフォルトの名無しさん:2007/12/03(月) 00:44:12
C言語を用いて文字の表示だけならそんなstdlibとか、int mainの後のゴチャゴチャなんかいらないんじゃないの?
よっぽど難しい本だな。
77デフォルトの名無しさん:2007/12/03(月) 00:46:30
コピペしたら普通に動いたがな
ソフトといやらの使い方間違ってんじゃないの?
78デフォルトの名無しさん:2007/12/03(月) 00:54:44
>>75
なんかめんどくさい書き方だなw
実際test表示するだけなら
#include <stdio.h>
main(){
printf("test\n");
}
だけ書けばおk。この書き方がいいかどうかは知らんがw
エラー文が「Projest is not compiled」
って表示されてるってことは、コンパイルせずに
いきなりプログラムを実行しようとしてるんじゃ…
79デフォルトの名無しさん:2007/12/03(月) 00:59:46
>>75
「コンパイルできてません」てエラー出てる様に見えるけど?
8075:2007/12/03(月) 01:09:18
どうやら、>>77の仰るとおりソフトの使い方が間違っているようです
>>78をコピペしてみましたがエラーが出てしまいました
「Project is not compiled」と表示される原因も解明し、>>78>>79の予想が見事に的中しコンパイルせずにプログラムを実行させてました

このまま同じソフトを使用し続けても打開できそうに無いので、もっと使いやすいソフトを模索してみようと思います
レスを下さった皆様、こんなくだらない質問に付き合っていただき誠にありがとうございました
81デフォルトの名無しさん:2007/12/03(月) 01:14:38
switch文で整数を奇数・偶数に判断するためにはどうしたらいいでしょうか?
82デフォルトの名無しさん:2007/12/03(月) 01:15:10
>>80
ちょww
最初はそんなもんだろwww
ほかのソフトに移っても似たような壁に最初はぶつかるよ。
その度ソフト変えてちゃ何も身につかない。
83デフォルトの名無しさん:2007/12/03(月) 01:16:24
>>81
switch( 値%2){

case 0://偶数
break;

case 1://奇数
break;
}
8475:2007/12/03(月) 01:25:19
>>82
私の考えが愚かでした
自分の理解力、技術力、英語力を棚に上げソフトのせいにしようとしていました
レスありがとうございます、やはり現在使用中のソフトでもう少しだけ頑張ってみます
プログラミング等に詳しい友人がいないので、自分に合った入門者向けの書籍や使用中のソフトの参考書を探して日々精進したいと思います
85デフォルトの名無しさん:2007/12/03(月) 01:27:54
規模の大きいプログラムを作るときにやはりassertは大量に使うものなの?
86デフォルトの名無しさん:2007/12/03(月) 01:35:14
3文字続けて入力→配列へ入れる 場合はどのように書けばよいのですか?

char [3];
sacanf("%c",&a,&b,&c);
87デフォルトの名無しさん:2007/12/03(月) 01:49:11
char a[3]; 
scanf("%c%c%c", &a[0], &a[1], &a[2]);
88デフォルトの名無しさん:2007/12/03(月) 01:55:38
2バイト文字についての質問なのですが

char aaa[] = "あいうえお";  と宣言したとします。これを







と表現したいです。この場合"あ"という文字のみ表現したいのですが
どのように書いたら宜しいのでしょうか?
pritnf("%s%s",aaa[0],aaa[1]);
無理でしょうかこれは
89デフォルトの名無しさん:2007/12/03(月) 01:59:11
試せよそれくらい。
腐るほど試して教科書読んで試してから
わからなかったら書き込め。
90デフォルトの名無しさん:2007/12/03(月) 02:03:22
今年1年研究のために腐るほどプログラム書いたけど
計算結果より計算量と勝負するのはいやだ。
91デフォルトの名無しさん:2007/12/03(月) 02:04:49
>>89
すいません、何通りか試した結果エラーで表示されないので質問しました。
解説読んだ限りですと、2バイト使用なのでアドレス2個表示すればいいのかな?
と思ったのですが2バイト分を指定して表示するという方法が思いつかないもので・・・
92デフォルトの名無しさん:2007/12/03(月) 02:09:33
そりゃ%cのところを%sにしたらエラーが出るわなぁ
93デフォルトの名無しさん:2007/12/03(月) 02:19:24
構造体配列にメンバは何個くらいが理想?
たくさん使うプログラムは危険?
94デフォルトの名無しさん:2007/12/03(月) 02:44:30
>>92
有難うございます!マルチバイト表示出来たの初めてです
pritnf("%c%c",aaa[2*x-2],aaa[2*x-1]);
で出来ました。ヒント有難うございます
95デフォルトの名無しさん:2007/12/03(月) 03:26:18
台形公式により面積を求めよって問題でC++だと起動したんですけどCだと
error C2275: 'FILE' : この型は演算子として使用できません
          : 'FILE' の宣言を確認してください。
error C2065: 'fpin' : 定義されていない識別子です。
っていうエラーがでてしまいます。どなたか解決策を教えてください。
#include <stdio.h>
int main()
{int i, j;
double S, h;
double x[15], y[15];
char c;
h = 0.1;
printf("入力\n");
FILE *fpin;
fpin=fopen("in.txt", "r");
while(fscanf(fpin, "%c", &c) != EOF)
for(i=0; i<15; i++)
{fscanf(fpin, "%lf", &x[i]);
fscanf(fpin, "%lf", &y[i]);
printf("x[%d] = %lf y[%d] = %lf \n", i, x[i], i, y[i]);
}
printf("面積\n");
S = 0.0;
for(i=0; i<14; ++i)
{
S += h*(y[i] + y[i+1])/2.0;
}
printf("S=%15.10lf \n", S);
getchar();
}
入力データ→http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5388.txt
96デフォルトの名無しさん:2007/12/03(月) 03:33:43
ググレ
9795:2007/12/03(月) 04:33:24
>>96
95です。解決しました。
ありがとうございました。
98デフォルトの名無しさん:2007/12/03(月) 07:10:51
const int a = 5;
int b[a];

て、できる?
99デフォルトの名無しさん:2007/12/03(月) 07:11:44
C99なら別に
int a=5;
int b[a];
もできるけど。
100デフォルトの名無しさん:2007/12/03(月) 07:12:30
ある文字定数がyかYなら実行、ってのをやりたいんだけど。
俺はこう書いたんだ

if(answer == 'y' || answer == 'Y' )

これをもうちょっと縮めて書くことはできない?
条件増やしまくるとマンドクサくなるんだが……。
101デフォルトの名無しさん:2007/12/03(月) 10:03:56
int tolower(int c)か?
102デフォルトの名無しさん:2007/12/03(月) 10:28:19
コードを短くすれば必ず効率よくなるってわけでもないから、無理に短くする必要もないと思うけど。
103デフォルトの名無しさん:2007/12/03(月) 11:08:46
このスレの対象者的には、効率よりもまず可読性を最優先するべき。
一目見て何をやってるか判断できるような書き方を徹底したほうがいい。
組み込み系のような非力な環境や画像処理でもない限り、処理速度が問題になることはそうそう無い。
効率はプログラム完成後にプロファイラ使って、時間食ってる関数を重点的に修正すれば劇的に改善する。
そもそも中級〜上級スレ向きの話題だしな。
104デフォルトの名無しさん:2007/12/03(月) 11:30:37
>>100
#define ANY_CASE_MATCH(v,lc) ((v) == (lc) || (v) == (lc) + 'A' - 'a')

if(ANY_CASE_MATCH(answer,'y')){}
105デフォルトの名無しさん:2007/12/03(月) 15:50:34
>>103
可読性重視ならよけいに100のままで良くね?
106デフォルトの名無しさん:2007/12/03(月) 15:54:16
>>105
>103は暗にそう言っているのではないか?
107デフォルトの名無しさん:2007/12/03(月) 15:56:41
以下読解力スレ。
108デフォルトの名無しさん:2007/12/03(月) 16:14:32
for(i=max;i;i--) if(!flg[i]) statement;

for(i=max;i && !flg[i];i--) statement;
と書くと同じようには動きません。
何故でしょうか。
109デフォルトの名無しさん:2007/12/03(月) 16:18:07
for文の括弧の中の2番目の式はループの終了判定だぞ。
110デフォルトの名無しさん:2007/12/03(月) 16:19:36
>>108
違うように書いているのだから、同じように動かないのは当然ですね。
111デフォルトの名無しさん:2007/12/03(月) 16:53:08
>>108
#include <stdio.h>

int main(){
int flg[10] = {0,0,1,0,0,1,1,0,0,0};
int i;

for(i=9;i;i--) if(!flg[i]) printf("%d",i);//987431
putchar('\n');
for(i=9;i && !flg[i];i--) printf("%d",i);//987

return 0;
}
flg[0]が読み取られないじゃねえか馬鹿野郎
112108:2007/12/03(月) 16:59:20
>>109-111
理解しました。お手数おかけしました。
113デフォルトの名無しさん:2007/12/03(月) 18:27:21
初めてC言語をやるんですけれども
皆さんコンパイラはどれをつかってるんですか?
114デフォルトの名無しさん:2007/12/03(月) 18:29:33
BCC
115デフォルトの名無しさん:2007/12/03(月) 18:37:02
>>114
マイクロソフト社のビジュアルスタジオだっけ?
あれってC++とかしかないんだよね?
116デフォルトの名無しさん:2007/12/03(月) 18:41:18
MSのビジュアルスタジオをどう略したらBCCになるんだよ
117デフォルトの名無しさん:2007/12/03(月) 18:44:40
   ↓    ↓      ↓
マイクロソフトのビジュアルスタジオ

CVC

CBC

BCC
118デフォルトの名無しさん:2007/12/03(月) 18:46:38
BCC developer
119デフォルトの名無しさん:2007/12/03(月) 18:59:53
ちがうってww
聞いたんだよ・・・
ビジュアルスタジオっていうのはC++しかないんだよねって
だから俺もBCCとか使おうかなって意味です・・
120デフォルトの名無しさん:2007/12/03(月) 19:00:31
分かったから使え
121デフォルトの名無しさん:2007/12/03(月) 19:05:43
根本的に勘違いしている気がする
122デフォルトの名無しさん:2007/12/03(月) 19:08:09
>>119
ビジュアルスタジオはVB,VC++,VC♯が入ってるくさい。
123デフォルトの名無しさん:2007/12/03(月) 19:09:11
CD付の入門書買えよ
124デフォルトの名無しさん:2007/12/03(月) 19:09:28
もちろん、VC++はCコンパイラの機能も持っている。
普通にプロジェクト作ると、拡張子cのファイルもC++としてコンパイルしてくれるけど。
125119:2007/12/03(月) 19:20:39
>>1読んだけど名前にレス番入れるの忘れてた・・
無知な俺にいろいろ教えてくれてありがとう
C++はCからの派生ということだと思っているんだが
C++はC+αってことでいいのかな?
ならVC#をDLすればCもC++もコンパイルしてくれるってこと?

126デフォルトの名無しさん:2007/12/03(月) 19:32:27
1にはC++はスレ違いって書いてないか?
127デフォルトの名無しさん:2007/12/03(月) 19:33:39
C++はCを含むが、C#とC++は別
128デフォルトの名無しさん:2007/12/03(月) 19:34:40
初心者はBCC developer
129デフォルトの名無しさん:2007/12/03(月) 19:36:07
そんなとこ悩むんだったらlinuxいれりゃあいいのに
すぐわかる。
130デフォルトの名無しさん:2007/12/03(月) 19:39:02
>>127
間違い。C++はCのうち重要な機能が割愛されていたりするので要注意。
# まぁ、入門レベルじゃ関係ないが。
131デフォルトの名無しさん:2007/12/03(月) 19:48:10
>C++はCのうち重要な機能が割愛されていたりする
そんたのあったっけ?後学のために教えてくれ。
132デフォルトの名無しさん:2007/12/03(月) 19:53:35
可変長配列とか可変個数引き数マクロとかrestrict修飾子とか?
(´・ω・`)どうせc99乙って言われるがな
133デフォルトの名無しさん:2007/12/03(月) 20:14:51
重要かどうかはともかく、C++では
暗黙の型システムの侵犯につながる機能があちこち塞がれている。
void*から他のポインタ型への暗黙の変換がないことはその最たる例。
134デフォルトの名無しさん:2007/12/03(月) 20:17:40
3次元配列って、Excelで言うとセルにつけられるコメントみたいなイメージ
だったんですが、違うんでしょうか?
135デフォルトの名無しさん:2007/12/03(月) 20:19:47
C++ではCの文法も使えるんじゃないの?
136デフォルトの名無しさん:2007/12/03(月) 20:22:11
VC2005ExpressとBCCのリンクくらいは、テンプレに入れといたほうがいいのかね…

個人的にはTurbo C++ Explorerも真のRADでいい感じなんだが。
コマンドラインでのコンパイルもbcc32.exeで可能だし、BCCと使い勝手は変わらない。
137デフォルトの名無しさん :2007/12/03(月) 20:23:39
>>134
例えがわけわかめ
138デフォルトの名無しさん:2007/12/03(月) 20:27:13
ワロタ
139デフォルトの名無しさん :2007/12/03(月) 20:28:59
>>135
現在のCの文法の概念が
C++から取り入れられてるのが多い。
140デフォルトの名無しさん:2007/12/03(月) 20:31:39
>>135
C++はCの上位互換ではない。
141デフォルトの名無しさん:2007/12/03(月) 20:35:16
>>140
マジすか?

Cで書いたソースを、まんま拡張子だけ.cppに変えてコンパイルすると
通るって聞いたけど。
142デフォルトの名無しさん:2007/12/03(月) 20:39:12
「通る」と「通る場合がある」との区別をつけないと
143デフォルトの名無しさん:2007/12/03(月) 20:40:44
厳密に言えば、という話だろ。

実際のところ、Cのみの処理系なんてもうほとんど存在しないんだし、
だいたいの人はC++処理系をC処理系として利用してるだろう。そんなに気にすることじゃないよ。
144デフォルトの名無しさん :2007/12/03(月) 20:42:40
>>141
malloc()の戻り値を適切な型にキャストしてなきゃ通らんだろうし
っていうか、それなんて言うコンパイラ?
145デフォルトの名無しさん:2007/12/03(月) 20:43:29
マジで!通らない場合もあるのか!
頼むよ、猫!!orz

ちなみに UNIX C と、Windows C はどう違いますか?
146デフォルトの名無しさん:2007/12/03(月) 20:44:47
大雑把に言えば、POSIX関数が使えるかどうか。
147デフォルトの名無しさん:2007/12/03(月) 20:48:08
>>144
ここ↓に書いてあったんですよ!
http://www.kumei.ne.jp/c_lang/cpp/cpp_00.htm
「極端なことをいうと全部C言語で書いてもC++のプログラムになります。嘘だと思ったら、今まで書いてきたCのソースファイルを「xxx.c」から「xxx.cpp」にリネームして、C++でコンパイルしてみてください。多分問題なくコンパイルできるはずです。」
148デフォルトの名無しさん:2007/12/03(月) 20:50:06
コンパイラにもよるが、拡張子でCソースかC++ソースかを判別してコンパイルする。
中身がCソースで拡張子がcppの場合は、C++ソースとしてコンパイルするので問題になる可能性がある。
つまり、C++としてのCへの準拠度の話なわけだ。
もちろん、拡張子がcppでも、コンパイラにCソースとしてコンパイルするようオプションを指定すれば問題無いはず。
149デフォルトの名無しさん :2007/12/03(月) 20:51:47
>>145
違いっていうよりも共通項は文法のみ
簡単なC言語のプログラミングならそうかわらんだろうけど
API関連となると全く変わってくる
150デフォルトの名無しさん:2007/12/03(月) 20:52:11
>>42
「malloc関数が返すアドレスは、void型のポインタです。
この型は、どんなポインタ変数にも代入出来るという型なので、
本当は(int *)にキャストする必要はないのですが、
C++コンパイラではキャストしないとエラーがでます。」
らしいです。
>>143
↑みたいな例が駄目な例なんですね。
151デフォルトの名無しさん:2007/12/03(月) 20:53:01
文字の二次元を作って出力したいのですが、
初期化の数が多いとエラーが出て思うようにいきません。
文字の数を減らす以外に方法はないですか?

char hairetu[5][5]={
{"笑","笑","笑","笑","笑"},
{"笑","笑","笑","笑","笑"},
{"笑","笑","笑","笑","笑"},
{"笑","笑","笑","笑","笑"},
{"笑","笑","笑","笑","笑"}
};
152デフォルトの名無しさん:2007/12/03(月) 20:54:16
char hairetu[][5][5]
153デフォルトの名無しさん:2007/12/03(月) 20:56:25
char* hairetu[5][5]だろ
154デフォルトの名無しさん :2007/12/03(月) 20:56:36
>>147
その人は糖尿病医やってるけど暇と金をもてあまして
VS購入して「こんな事できるんだぜ」って自慢したくて
しかたがないプログラマーだからね
155デフォルトの名無しさん:2007/12/03(月) 20:57:54
>>154
そうなんですか。いいこときいた。
猫に理解できる筈ないですもんねぇ。。
156デフォルトの名無しさん:2007/12/03(月) 20:59:18
>>154
コードはどうしようもないけどお世話になったよ「猫でも」には
157デフォルトの名無しさん:2007/12/03(月) 21:04:00
>>150
どっちもオレなんだけどw

「C++ソースとしてのC文法」と「CソースとしてのC文法」。この違いを理解してくれ。
VC2005やBCCなどのC++処理系を使っても、Cソースとして書いてCソースとしてコンパイルする限り問題は起こらない。
そういう意味で気にするなと言っている。そもそもC++はスレ違いだし。
158デフォルトの名無しさん:2007/12/03(月) 21:10:30
>>157
違います!↑の位置がもろ>>143に向いてたので誤解されちゃいましたねorz
「駄目な例」ってのは、「malloc関数を使う時はCの文法がC++のコンパイラで通らない」
って意味で、↑は、上の「malloc関数が返すアドレスは〜〜」の文章を指してるんですね。
分かりづらくてすみません!汗

「C++ソースとしてのC文法」と「CソースとしてのC文法」。
これが若干違うんですね。スレ違い、失礼しました。
159デフォルトの名無しさん:2007/12/03(月) 21:15:09
>>149
UNIX C に慣れた人間が、Windowsフォーム、バリバリのアプリケーション
を作れるようになるには、どのくらいかかるでしょうか?
160デフォルトの名無しさん:2007/12/03(月) 21:16:50
>>159
UNIXもフォームはあるだろう UNIXでアプリを作れるならたいしたことはないだろう
DOS、CUIしかやったことないならかなりかかる
161デフォルトの名無しさん:2007/12/03(月) 21:18:07
>>160
DOSだけなので、かなりかかりますね。。ありがとうございました。
162デフォルトの名無しさん:2007/12/03(月) 21:21:45
>>161
GUIプログラミングの出来る、C#とかボーランドC++とかなら速いのでは?
使い方で憶えることは多いけど、動かせればVC++よりは速そう
163デフォルトの名無しさん:2007/12/03(月) 21:23:10
>>157
>VC2005やBCCなどのC++処理系を使っても
なんと無く違和感あるな。
C++コンパイラとしてもCコンパイラとしても動くんであって、
別にC++の処理系使ってCのソースコンパイルしてる訳じゃないんじゃ?
164デフォルトの名無しさん:2007/12/03(月) 21:26:19
>>163
うむ。正しくはC/C++処理系だね。
165デフォルトの名無しさん:2007/12/03(月) 21:30:56
>>162
でも今求められてるのは、VC++なんです。死亡するしか・・・
何が分からないって、レジストリとかINIファイルとかが分かりません・・・。
これらの扱い方を知るのにはどのくらいかかるでしょうか?
166デフォルトの名無しさん:2007/12/03(月) 21:32:40
>>165
適切な本があれば一日でおk
167デフォルトの名無しさん:2007/12/03(月) 21:32:59
C言語では頭にstatic,auto,constなどがつくと、型宣言を省略すると自動でintにするそうですが、
C++ではできなくなったことを考えると、やはり推奨されない書き方なんでしょうか?
168デフォルトの名無しさん :2007/12/03(月) 21:37:25
>>167
VBじゃないんだから
適切な型を適切な場所に書きましょうや
169デフォルトの名無しさん:2007/12/03(月) 21:38:24
>>166
んだば、がんばるべ。
170167:2007/12/03(月) 21:47:07
>>168
そうですよね。いちおう慣習に従いたいと思いまして質問しました。
やはり、面倒でも普段からきっちり書く癖を付けとくのは大事ですよね
171デフォルトの名無しさん:2007/12/03(月) 21:48:13
INIファイルというのは、「.INI」じゃなくてもいいものなんでしょうか?
.DATと同じく、慣習的に設定を記録するテキストファイルを「.INI」で
保存しているだけなんでしょうか?
172デフォルトの名無しさん:2007/12/03(月) 21:49:29
>>171
自分で使う分にはいいんでないかな。
173デフォルトの名無しさん:2007/12/03(月) 21:52:59
只今VC++を使っています。
DOS窓からコンパイル、実行しようとしてもできないのですが
174デフォルトの名無しさん:2007/12/03(月) 21:57:32
>>172
了解しました!ありがとうございました!!
175デフォルトの名無しさん:2007/12/03(月) 22:01:17
>>173
それくらい自分で調べないと、先は厳しいぞ?
はっきり言って、プログラミングは調べ物のオンパレードだ。
176デフォルトの名無しさん :2007/12/03(月) 22:01:50
>>173
VS2005コマンドプロンプトを開いてそこからコンパイルしる
177デフォルトの名無しさん:2007/12/03(月) 22:05:24
>>175-176
どうにか解決できました・・・
type 名前.cで一度開かないとだめみたいでしたね
わからないことが多すぎ
これじゃぁ先が思いやられるなorz
178デフォルトの名無しさん:2007/12/03(月) 22:07:44
いや、それは間違ってるだろ
179デフォルトの名無しさん:2007/12/03(月) 22:09:56
え・・・
違うのですか?
できれば教えてほしいのですが
180デフォルトの名無しさん:2007/12/03(月) 22:15:00
>>179
Visual C++ 2005 Expressを使ってると仮定するけど。
まずは↓あたりを参考にしてセットアップしてくれ。
http://lets-go.hp.infoseek.co.jp/c_setting09.html
181デフォルトの名無しさん:2007/12/03(月) 22:23:01
>>180
Platform SDKをインスコすればいいのですね?
182デフォルトの名無しさん:2007/12/03(月) 22:34:03
>>180が終わればIDEのセットアップは完了。

さらにコマンドラインでコンパイルしたいなら、
1.↓のファイルを別名でコピーとかしてバックアップしておく。
 C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat
2.テキストエディタで↑を開く。
3.以下の3行を探して編集する。
 @set INCLUDE=先頭にPlatform SDKのIncludeフォルダを追加(セミコロン区切り)
 @set LIB=先頭にPlatform SDKのLibフォルダを追加(セミコロン区切り)
 @set LINK=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
4.スタートメニューから[Visual Studio 2005 コマンド プロンプト]を起動。
5.cl.exe hoge.c
183デフォルトの名無しさん:2007/12/03(月) 22:52:06
>>182
それをやるとどうなるの?
180のやつですぐコンパイルできるんじゃないのですか?
初心者過ぎてすいません><
184デフォルトの名無しさん:2007/12/03(月) 22:56:04
>>183
コマンドラインでコンパイルしたいんでしょ?
>>180はIDEのセットアップ。>>182はVS2005コマンドラインのセットアップ。
コマンドラインを使わないなら>>182は不要。
185デフォルトの名無しさん:2007/12/03(月) 22:59:23
>>184
こまんど・・・らいん?
186デフォルトの名無しさん:2007/12/03(月) 23:02:34
>>185
コマンドライン=DOS窓
187デフォルトの名無しさん:2007/12/03(月) 23:08:00
>>186
ありがとうございます
アプリケーションからOSを操作することによってどうなるのですか?
188デフォルトの名無しさん:2007/12/03(月) 23:10:31
構造体というのは、
struct s1
{
int num;
};

のように、中のメンバを1個にするなら、あまり意味がないと思っていいのでしょうか?
189デフォルトの名無しさん:2007/12/03(月) 23:13:34
>>188
敢えてそうしているプログラムがあるなら、何か理由があるのでしょう。
普通は、そういうところにこそコメントを書いておくものですが。
190デフォルトの名無しさん :2007/12/03(月) 23:13:54
アプリケーションからOSを操作することによって
アプリケーションからOSを操作することができます。
191デフォルトの名無しさん:2007/12/03(月) 23:14:05
>>187
アプリケーションからOSを操作したいんですか?
192デフォルトの名無しさん:2007/12/03(月) 23:14:39
>>190
アプリケーションからDOS窓を操作できると考えていいのですか?
193デフォルトの名無しさん:2007/12/03(月) 23:16:04
DOS窓からコンパイル
DOS窓から起動
194151:2007/12/03(月) 23:18:32
先ほどはありがとうございます。

char hairetu[5][5]={
{1,1,1,1,1},
{1,1,1,1,1},
{1,1,1,1,1},
{1,1,1,1,1},
{1,1,1,1,1}
};

型が違うので#define 1 笑とできないのですが、
別の表記の仕方ありますか?

笑笑笑笑笑
笑笑笑笑笑
笑笑笑笑笑
笑笑笑笑笑
笑笑笑笑笑

結果的に上のように表示して、上のようにしたいのですが。
switch(map[5][5])が使えず参っています。
195デフォルトの名無しさん:2007/12/03(月) 23:18:39
#include <stdio.h>
/* #include <string.h> は要らないかな・・・ */
int testchk(char[] str) {
printf("%s", &str);
return 0;
}

void main() {
// int rev(char[]);
char str[5] = "aaaa";
testchk(str);
}

エラー E2293 dame.c 3: ) が必要
*** 1 errors in Compile ***

間違ってないと思うのですが、なぜ3行目に ) が必要だとエラーが出るのでしょうか?
)を足しても )が必要だと言われ続けます。)の数は間違ってないと思います。
196デフォルトの名無しさん:2007/12/03(月) 23:19:17
>>187
待て。
DOS窓はOSじゃない・・・とも言い切れないがなんか違う。
うまく簡単に言えんなぁ。

ようは、マウスから入力してWindowsを操作する(GUI)のではなくて
キーボードから文字を打ち込むことでWindowsを操作する(CUI)ためのアプリだ。

WindowsXPだと、スタートメニュー→全てのプログラム→アクセサリ→コマンドプロンプトだ。
197デフォルトの名無しさん:2007/12/03(月) 23:22:24
>>195
int testchk(char str[]) {
198デフォルトの名無しさん:2007/12/03(月) 23:22:46
>>195
確かめてないけど、
int testchk(char str[]) {
こうちゃうか?
char[] strとかってC++はそう書けたっけ?
Cなら他には char* strとか?
199デフォルトの名無しさん:2007/12/03(月) 23:27:21
>>195
あなたは間違っていません
世の中のCコンパイラが間違っているのです

これでいい?
200デフォルトの名無しさん :2007/12/03(月) 23:29:30
>>195
int testchk(char str[]) {
printf("%s", str);
return 0;
}
201デフォルトの名無しさん:2007/12/03(月) 23:30:12
>>196
マウスから操作するのではなく
キーボードで操作するところまでは理解できました。
アプリケーションでOSを動かすというのは
例えば
普通はマウスでDOS窓を開いた場合はアプリケーションでOSを動かしたとは言わない
しかしキーボードから文字を打ち込みDOS窓を開いた場合(開けるかわからんが)はアプリケーションでOSを動かしたといえる
こんな感じですかね?

202デフォルトの名無しさん:2007/12/03(月) 23:33:36
>>194
超エスパーだが、こういうことがしたい?
int i,j;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
switch(map[i][j]){
case 1:
printf("笑");
break;

default:
printf(" ");
break;
}
}
printf("\n");
}

なんか正直switchとかdefineとか、
出てくるところが分からないんだけど
203デフォルトの名無しさん:2007/12/03(月) 23:42:38
ごめん、全体を読んで無いくせにあれこれいうのもなんだけど、
>>201
キーボードから文字を打ち込みDOS窓を開くって、スタートメニューのファイル名を指定して実行の文字列にcmdを
入れるって事を意識してる?

また、別の手法でドス窓から別のDOS窓を新規で起動しても、
「アプリケーションでOSを動かした」とは言えない気がする。

この場合、DOS窓と言うOSアプリケーションでOSのアプリをもう一個動かしたと表現するなら理解出来そうな気がする。
204デフォルトの名無しさん:2007/12/03(月) 23:43:29
>>201
意味が分からないんだけど、複雑に考えすぎじゃない?
そもそもアプリケーションでOSを動かすってどこから出てきた?
205デフォルトの名無しさん:2007/12/03(月) 23:44:27
>>201
>アプリケーションでOSを動かす
>>187 = >>201なら、「アプリケーションでOSを動かす」という言葉は忘れろ。
誰もそんなことは言ってない。

Windows(またはDOS窓)には「環境変数」と言うものがあって、
VC(またはcl.exe:コンパイラ)は、実行するときにその「環境変数」から動作環境を取得する。
その環境変数の設定が>>182であり、>>184でいう「VS2005コマンドラインのセットアップ」
それぞれの環境変数(動作環境)の意味は、まずは知らなくても良いと思うよ。
206デフォルトの名無しさん:2007/12/03(月) 23:45:46
「OSを動かす」定義って何だ?
OSに対して何かのリクエストを働きかけて結果のレスポンスを得る事が
「OSを動かす」事でいいの?

207デフォルトの名無しさん:2007/12/03(月) 23:53:38
そもそもどこから OS なんて言葉が出てきたんだ?
208デフォルトの名無しさん:2007/12/03(月) 23:55:15
もう1つ。
お前は 「コンパイルする方法を知りたい」 のか?
「DOS窓からコンパイルする方法を知りたい」 のか?
209デフォルトの名無しさん:2007/12/04(火) 00:07:44
皆さんごめん・・・
なんかややこしくなってきたorz
とりあえずC言語が終わったらその意味を調べることにするよ
ありがとうございました

>>208
コンパイルする方法をしりたいです。

DOS窓からはtype 名前.cで読み込ませcl 名前.cでコンパイルしたんだけど
なんか違うらしい・・・
できればコンパイルの方法を教えてください
210デフォルトの名無しさん:2007/12/04(火) 00:10:28
>>209
>とりあえずC言語が終わったらその意味を調べることにするよ

今調べなさい
211デフォルトの名無しさん:2007/12/04(火) 00:11:19
>>207
えーと
APIを導入するみたいなことで・・・
APIとはアプリケーションからOSを起動するみたいなことだったから
212デフォルトの名無しさん:2007/12/04(火) 00:13:23
>>210
すいません・・・
今調べました
VC++で組んだプログラムで電源をOFFにしたりできるってことですよね?
213デフォルトの名無しさん:2007/12/04(火) 00:14:00
お話の途中で申し訳ないですが、質問させてください。
今Unixシステムコールでパイプを使う練習してるのですが、
下のように書くと親プロセスがread()のあたりで止まってしまいます。
これはなぜなんでしょうか。

int main(int argc, char ** argv)
{
pid_t pid = fork() ;
int fd[2] ;
pipe(fd) ;

if( pid == 0 )
{
close(1) ;
dup2(fd[1],1) ;
execlp("echo","echo","hoge",NULL) ;
}
else if( pid > 0 )
{
int status ;
close(0) ;
dup2(fd[0],0) ;
waitpid(pid,&status,0) ;
char buffer[10] = {'\0'} ;
read(0,buffer,sizeof(buffer)) ; // ここで止まる
printf("%s",buffer) ;
printf("end\n") ;
}
return 0 ;
}
214デフォルトの名無しさん:2007/12/04(火) 00:14:05
>>211
起動じゃないな

処理を依頼するって感じ

APIによっては機能を借りるとか
215デフォルトの名無しさん:2007/12/04(火) 00:18:52
>>212
もちろんそういうAPIもある。ExitWindowsExだっけ?
216デフォルトの名無しさん:2007/12/04(火) 00:24:03
>>212
で、それがしたいのか?

かいつまんで調べるんじゃなくてコマンドラインについて勉強してください
217デフォルトの名無しさん :2007/12/04(火) 00:26:01
>>209
VC++立ち上げてメニュー項目のツール選んだらドロップダウンの
項目の中にVS2005コマンドプロンプトってのがあるでしょ?
それを開いたらパスの通ったいわゆるDOS窓ってやつが開くから
そこからcd..でコンパイルしたいファイルのあるフォルダに移動して
そこでcl.exeを使用してコンパイル出来る。
ファイル名を指定して実行でcmdって打ってコマンドプロンプト
開いてもそれはパスの通ってないコマンドプロンプトだから意味無い

ていうか、普通にIDEの機能使ってコンパイル・実行してれば
良いじゃん
218213:2007/12/04(火) 00:35:52
別スレで質問した方がよさそうですね。
お邪魔しました。
219デフォルトの名無しさん:2007/12/04(火) 00:39:22
>>218
すいません
俺のせいで・・・

とりあえずもう一度調べてまた来ます
220デフォルトの名無しさん:2007/12/04(火) 00:41:25
>>213>>218
止まらんぞ?
221デフォルトの名無しさん:2007/12/04(火) 00:50:15
プログラミングの合間に出会い系
■最近流行りのSM系サイトを知っていますか?

それは「SMプレイをすること」を最終目的とした人達が集まる出会い系サイトのことです。
普通の出会い系サイトと一味違った、熱い出会いが全国各地で繰り広げられています。

《ブログ SM系サイトが会える訳》
http://smsite.blog123.fc2.com/

ブログでは管理人一押しのSM系サイトを紹介しています。
是非ご利用下さい。
222デフォルトの名無しさん:2007/12/04(火) 00:51:12
うーん、どうもPlatform SDKをたいそうな代物と思い込んでるみたいだな。
Platform SDKを入れる目的はC/C++のネイティブコードを生成するためだ。
何故なら、VC++2005Express単体では.NETベースのアプリしか作れないから。
もちろん人によってはWinAPIを使うためでもあるんだが、それはWindows GUIプログラムを
やるようになってから気にすればいい話で、入門には全く関係無いと思っていい。

だからとりあえずは、「.NET用のコンパイラをC/C++に対応させるために必要」とだけ考えればいいよ。
…って、もういないのか。
223デフォルトの名無しさん:2007/12/04(火) 01:17:20
#include <stdio.h>
/* #include <string.h> は要らないかな・・・ */
int testchk(char str[]) {
printf("%s", str);
return 0;
}

void main() {
// int rev(char[]);
char str[5] = "aaaa";
testchk(str);
}

で正常に動作しました。皆さんありがとうございました。
char[] str としていたのが原因でした。 char str[] でOKでした。
C言語はちょろっとやって、今はJavaをずっとやっているせいで配列の書き方Javaみたいに
書いてしまって間違ってました。 Javaだと String[] args とか書くので・・・あちゃー・・・。
こりゃ間違いに気づかないわ・・・。
224デフォルトの名無しさん:2007/12/04(火) 03:19:07
>>222
ただのC/C++プログラム書くだけだったら、ただのVC++ EEでも
標準C/C++ライブラリは使えるし、
コンパイラもネイティブな機械語吐くしで、
Platform SDK要らなくないか?
225デフォルトの名無しさん:2007/12/04(火) 08:00:40
>>194

そもそも「笑」が2byteだということを理解してる?
226デフォルトの名無しさん:2007/12/04(火) 08:21:32
>>225
Javaはcharって2byteだよね。C言語のcharは1byteだから 「笑」は1つの要素内には入りきれない
って事か。他の人の質問だけどオレも思い出しつつ勉強になるw
227デフォルトの名無しさん:2007/12/04(火) 08:53:41
wchar_tなら2byteだな
228デフォルトの名無しさん:2007/12/04(火) 10:43:26
4byteかもしれんぞ
229デフォルトの名無しさん:2007/12/04(火) 12:23:30
日本語と英語が混じった文章から、日本語のみを抽出する方法ってありますか?
230デフォルトの名無しさん:2007/12/04(火) 12:27:40
あるよ
231デフォルトの名無しさん:2007/12/04(火) 13:50:51
>>224
調べてみたが、どうやら標準C/C++のコンソールアプリだけならその通りらしい。
必ずPlatform SDKも入れてたからあんまり深く考えてなかったよ。
というわけで、Windows APIが不要ならばPlatform SDKは不要ということだな。

まあ入れておいても損は無いものだし、どうせ後で使いたくなるだろうから、
面倒くさいセットアップは最初に済ませておいたほうがラクだというのは変わらんが。
232デフォルトの名無しさん:2007/12/04(火) 14:06:18
んなこたーない。その前にSDKのリビジョンが変わっているかも知れないし、
OSを再インストールしているかも知れない。
233デフォルトの名無しさん:2007/12/04(火) 14:53:29
>>232
スマンが何が言いたいのかわからん。結論を述べてくれ。
234デフォルトの名無しさん:2007/12/04(火) 15:29:11
>まあ入れておいても損は無いものだし、
>232
>どうせ後で使いたくなるだろうから、
そんとき入れれば充分。
235デフォルトの名無しさん:2007/12/04(火) 20:19:10
与えられた個数の正の整数を格納している配列のうち、最大となる値を検出して、その値を
格納している配列要素の値を0に書き換える。すると新しい配列においては、もとの配列で
大きい方から数えて2番目の数値が最大値となっている。さらにもう一度、この新しい配列
における最大値を格納している配列要素の値を0に書き換える。するとこの時点でのさらに
新しい配列では、最初の配列において大きい方から数えて3番目の数値が最大となってい
る。このことを利用して、下記のプログラムを作成せよ。
(ここで示した方法は、いわゆる整列(ソーティング)問題の1つの解法となり得るが、効率的
な方法ではない)

 まずメイン関数において、キーボードから正の整数の個数(100以内)を入力し、次いで実
際の数値を配列に入力する。そしてメイン関数はサブ関数に、入力した個数と配列を引数とし
て渡す。
 サブ関数は、これらの配列から、まず1番目に大きい数を見つけて、それを別途設けた配列
の先頭の要素に格納し、次に2番目に大きい数を見つけてこれをこの配列の先頭から数えて
2番目の要素に格納し、という処理を最後の数に至るまで繰り返す。これにより新しい配列に
は大きい数から順に並んでいることになるので、これを引数を利用してメイン関数に渡す。(す
なわちサブ関数は引数を3つ持つことになる。1つはデータの個数を示す変数、1つは入力デ
ータを格納する配列、残りの1つはサブ関数で計算した結果を格納する配列である)
 最後にメイン関数はサブ関数で計算された新配列の値を若い方の要素から順に(即ち大き
い数から順に)画面に表示する。またこの数列の中央値を表示する(中央値に小数が含まれ
る場合は、その小数を切り捨てた整数を表示することとする)。
236デフォルトの名無しさん:2007/12/04(火) 20:22:46
宿題スレ池
237デフォルトの名無しさん:2007/12/04(火) 23:36:42
>>228
あれ、wchar_tって4byteのこともあるの?
wのcharで必ず2byteだと思ってた
238デフォルトの名無しさん:2007/12/05(水) 00:17:56
>>237
Linuxだと4byteだったりすることもある
239デフォルトの名無しさん:2007/12/05(水) 00:24:38
詳しくないけど、内部表現がUTF-32なら4バイトになるんじゃないの?
wchar_tって文化固有の言語をサポートする固定長の文字コードのことだったような。
240デフォルトの名無しさん:2007/12/05(水) 00:28:03
#include <stdio.h>

void sort_ch(char *buf) {
  int i, j;
  char key;
  for (i=1; buf[i] != '\0'; ++i) {
    for (j=i; j>=1; --j) {
      if (buf[j] < buf[j-1] ){
        key = buf[j];
        buf[j] = buf[j-1];
        buf[j-1] = key;
      }
    }
  }
}

int main() {
  char buf[256] = {'\0'};
  fgets(buf, sizeof(buf), stdin);
  sort_ch(buf);
  printf("%s\n", buf);
  return 0;
}

ポインタ変数を扱う場合、配列( [ ] )として扱わず、間接参照演算子( * )を用いること。

これがわかりません・・・どうすればいいんでしょうか
241デフォルトの名無しさん:2007/12/05(水) 00:37:13
>>238-239
そういやwはダブルじゃなくてワイドだよね orz 逝ってくる
242デフォルトの名無しさん:2007/12/05(水) 01:04:20
>>240
#include <stdio.h>

void sort_ch(char *buf)
{
 int i;
 int j;
 char key;
 for ( i = 1 ; *(buf + i) != '\0' ; ++i )
 {
  for ( j = i ; j >= 1 ; --j )
  {
   if ( *(buf + j) < *(buf + j - 1 ) )
   {
    key = *(buf + j);
    *(buf + j) = *(buf + j - 1 );
    *(buf + j - 1 ) = key;
   }
 }
 }
}

int main( void )
{
 char buf[256] = {0};
 fgets( buf, sizeof(buf), stdin );
 sort_ch( &buf[0] );
 printf("%s\n", &buf[0]);
 return 0;
}
243デフォルトの名無しさん:2007/12/05(水) 01:05:57
>>240
追記。
自分だけなら別にいいけど、人にソースを見せる場合とかは、
つめすぎず、ifやらwhileやらの行に{をつけず
改行してインデントをつけて{をつけると、ブロックが分りやすくなるよ。
っていうか自分で見てても分りやすくなってミスってる部分すぐわかる。
244デフォルトの名無しさん:2007/12/05(水) 01:10:28
更に追記orz
説明忘れてた。
char型配列はアドレスが1づつずれてる(1Byteだから)
だから*ポインタの指し示すアドレスの中身
(*は中身 &はアドレス)
よって、bufの中身 *buf で そのbufが保存しているアドレス+iとかjとか、つまりカウントアップさせていっているから
1づつアドレスがずれて処理が出来るってこと。

ポインタは「アドレス」と「アドレスが示す中身」を把握すればどってことないよ
245デフォルトの名無しさん:2007/12/05(水) 01:49:59
俺はポインタでも p[-1] とか普通に書くけどな…

>>240
要するに buf[i] を *(buf + i) と書け、ってことだ
246デフォルトの名無しさん:2007/12/05(水) 02:36:13
typedef struct first
{
char name
int low, high, average;
int count;
Order *key;//構造体へのポインタ
}Firtst;

このような構造体を作成し

First **first; を宣言します。

これに対して領域の確保+ゼロクリアを行いたいのです。
どのようにすればよいのでしょうか。

それと
first = (first**)malloc(number, sizeof(First)); //numberは全体の個数
first[0][0].name = '\0';
とすると実行時にエラーが発生します。
何故なのでしょうか。

よろしくお願いします。
247デフォルトの名無しさん:2007/12/05(水) 04:20:04
>>246
なんでポインタのポインタなの?
意図は?
248デフォルトの名無しさん:2007/12/05(水) 09:47:23
a[0][0], a[0][1], ・・・, a[0][10]
a[1][0], a[1][1]
a[2][0], a[2][1], ・・・, a[2][100]
・・・

といった感じで
配列の要素数も配列の個数も不明
要素数×配列数 = number
numberの大きさはファイルから読み込むようにしたいのです
249デフォルトの名無しさん:2007/12/05(水) 09:55:19
そんな無茶な
250240:2007/12/05(水) 10:25:57
ありがとうございます!!
勉強になりました!
251デフォルトの名無しさん:2007/12/05(水) 10:30:28
>>246
>first = (first**)malloc(number, sizeof(First));
この場合、mallocが返すのはFirstへのポインタ、つまりFirst*型
それをポインタのポインタに変換すんのは無茶
252デフォルトの名無しさん:2007/12/05(水) 10:56:12
初心者過ぎてわかりません。

2x+y+3z=11
4x+3y+10z=28
2x+4y+17z=31

Gaussの消去法とLU分解法でお願いします。
253246:2007/12/05(水) 11:01:07
そうですか・・・
ありがとうございました
254デフォルトの名無しさん:2007/12/05(水) 11:14:48
>>252
初心者過ぎてわかりません。

日本語でお願いします。
255デフォルトの名無しさん:2007/12/05(水) 11:17:50
>>246
方針としては、要素数が配列毎に一定なら二次元配列は諦めて配列で管理するようにすることを検討することをお勧め。
# 手頃でパフォーマンスも落ちない。
要素数も各配列毎にまちまちだったりするならポインタの配列として管理することになる。
それらが動的だったりするならリスト構造を使うことになるかな。
256デフォルトの名無しさん:2007/12/05(水) 11:18:00
まだはじめたばっかで、出されたレポートがまったくわからないんです。
教科書見ても、載ってないので手が出ないんです。

先ほど連立一次方程式をGaussの消去法とLU分解法で解いて欲しいんです。
257デフォルトの名無しさん:2007/12/05(水) 11:22:49
「先ほど」「解いて欲しい」とはまた面妖な。
258デフォルトの名無しさん:2007/12/05(水) 11:25:19
>>252
x=3
y=2
z=1
259デフォルトの名無しさん:2007/12/05(水) 11:35:03
>>252
上から順に(1)式(2)式(3)式とする。
(3)式から(1)式を引いて(4)式とする。
(2)式から(1)式を2倍したものを引いて(5)式とする。
(4)式から(5)式の3倍を引くとzが確定する。
(4)式に代入するとyが確定する。
(1)式に代入するとxが確定する。
260252:2007/12/05(水) 12:02:28
できればプログラムを見せていただきたい。
261デフォルトの名無しさん:2007/12/05(水) 12:15:04
>>260
>259
262デフォルトの名無しさん:2007/12/05(水) 12:18:00
>>260
自分で考える気がないなら宿題スレへ
http://pc11.2ch.net/test/read.cgi/tech/1195668114/
263252:2007/12/05(水) 12:20:40
了解した。
264デフォルトの名無しさん:2007/12/05(水) 14:03:01
良すれ
265デフォルトの名無しさん:2007/12/05(水) 16:06:06
データを取るためにファイルに数値をどんどん書き込んでいくプログラムを作っています

本などを見るとオープンするファイルの拡張子が.datとなっているものを
よく見かけるのですが.txtとどう違うんですか?
266デフォルトの名無しさん:2007/12/05(水) 16:07:58
プログラム言語以前の問題だな
267デフォルトの名無しさん:2007/12/05(水) 16:08:05
>>265
c的には何ら変わりがない。
もしあんたが、拡張子毎に違うアクションを起こすようなGUIを使っているなら、違うアクションを割り当てることができるくらいの違い。
268デフォルトの名無しさん:2007/12/05(水) 16:10:03
>>267
そうなんですか
ありがとうございました
269デフォルトの名無しさん:2007/12/05(水) 16:14:58
270デフォルトの名無しさん:2007/12/05(水) 17:23:00
誰か>>229お願いします
271デフォルトの名無しさん:2007/12/05(水) 17:39:38
>>270
文章から、アルファベットやら半角スペースを取り除くってのはどう?
272デフォルトの名無しさん:2007/12/05(水) 17:49:29
普通にstrtokでwhitespaceとアルファベットと数字を全部区切り文字にしちゃえばいいんでないかい?
273デフォルトの名無しさん:2007/12/05(水) 17:57:11
コード体系も明かさないというのにどうしろと
274デフォルトの名無しさん:2007/12/05(水) 20:09:46
>>270
マルチバイトが判定できればいい、かつShiftJIS限定だけど。
1バイト目は0x81〜0x9F、および0xE0〜0xFCの範囲って決まってんだから、
あるバイトがその範囲内なら次の1バイトと合わせて1文字ってみなせばいい。
馬鹿正直に
if ( (0x81 <= c && c <= 0x9F) && (0xE0 <= c && c <= 0xFC) )
って書いてもいいけど、With UNZに
if ( ((unsigned char)((c ^ 0x20) - 0xA1) <= 0x3B) )
って(Pentium向けの)最適化が載ってるな。
275デフォルトの名無しさん:2007/12/05(水) 21:52:33
前にAPIについて質問させてもらったものですが・・・
ネイティブコード=機械語
SDKはネイティブコードが使えるようになる?でいいんですよね?
C言語をコンパイルするとそれは機械語に変換されるのではないのですか?
質問がよくわからなくてすいません・・・
276デフォルトの名無しさん:2007/12/05(水) 22:02:14
この前秋葉に行ったらメイドさんがたくさんいたんだが
もう治安が悪くなってしまったのかな。
28歳だけど今からC言語勉強してもプログラマにはなれませんかね。
277デフォルトの名無しさん:2007/12/05(水) 22:08:52
泣きごと言ってるだけじゃなれないのは確かだ。
278デフォルトの名無しさん:2007/12/05(水) 22:22:15
>>275
SDK は Software Development Kit (ソフトウェア開発キット)の略
例えば Microsoft Platform SDK は MS プラットフォーム用のソフトウェアを
開発するために必要なライブラリとかヘッダファイルとかツールとかをまとめたもの
ネイティブコードがどうとかいったものではない
279デフォルトの名無しさん:2007/12/05(水) 22:40:26
>>278
VC++だけではウインドウを表示したりすることができない
文字を表示することはできるが
ソフトウェアを作ることができない
そこでSDKを導入することによりC言語でソフトウェアが作成できるようになる
こんな感じで理解しておk?
280デフォルトの名無しさん:2007/12/05(水) 22:45:06
         ,. -''' ´ ̄` '''- 、
        /          \
      __/              ヽ
   / ′      _  ._    ` ̄`ヽ 
   {           ´・ .〈・        } 
   `ーl          r、_)       ノ
   r''⌒`丶、     `ニニ'    `‐t‐''´
    !       \              /
    ヽ        \       , イ
    \      `L__,, -‐'´  |
      \      ノ \       !
        `'ー--‐'′   \__,ノ

        星野カービィ

281デフォルトの名無しさん:2007/12/05(水) 23:04:17
>>279
>文字を表示することはできるが
>ソフトウェアを作ることができない

文字を表示するだけのプログラムは、ソフトウェアではないと。
282デフォルトの名無しさん:2007/12/05(水) 23:04:57
C言語のソースで、こんなの↓見ました。

int AAA(st)
   STR_BB *st;
{
  long CCC();
  int ddd = OK;

  処理...

return( ddd );
}

これってなんですか?
int型のint AAAっていう関数を、仮引数 st を取るものとして作ってる??
その後の
   STR_BB *st;
は一体何・・??

  int ddd = OK;

は int型の変数dddなのに、何故、「OK」を代入してる??
分からないことだらけです!教えてください!
283デフォルトの名無しさん:2007/12/05(水) 23:09:36
>>281
ん〜
ウインドウを表示たりするプログラムが作れないってことでいいかな?
284デフォルトの名無しさん:2007/12/05(水) 23:20:45
>>282
それは昔のCで使われてた古い書き方
int AAA(st)
STR_BB *st;
{
}

int AAA(STR_BB *st)
{
}
と一緒

OKの方は
#define OK 0
とかじゃねーの?
285デフォルトの名無しさん:2007/12/05(水) 23:21:06
>>282
>int AAA(st)
>   STR_BB *st;
ANSI前の古い書き方で、「int AAA(ATR_BB *st)」とほぼ同じ意味。

>int ddd = OK;
どこかで「OK」が#defineされてたりするんじゃないか?
コード上でなければ、コンパイル時に-DOK=1とか付いてるとか
286デフォルトの名無しさん:2007/12/05(水) 23:22:08
>>283
それでおk
287デフォルトの名無しさん:2007/12/05(水) 23:25:01
気合と根性があれば、
APIを使わなくても
ウィンドウを表示するプログラムは作れるよ!
288デフォルトの名無しさん:2007/12/05(水) 23:31:51
>>284-285
そうなんですね、大変助かりました!
OKはドンぴしゃり!!

#define OK 0
#define NG -1

でした。昔の書き方なんですね。入門書を目を皿にして読んでも見つからない筈です。
聞いてよかった・・本当に大変助かりました!!!ありがとうございました!!

AAA(STR_BB *st)の、STR_BBは構造体でしょうか?
structは省略できるんでしたっけ・・・

AAA関数の中にある、
  long CCC();
は何でしょうか?CCCっていう関数??

初心者すぎてすみません!!
289デフォルトの名無しさん:2007/12/05(水) 23:37:31
>>283
ありがとうございます

>>287
そうなんですか?
それは全部C言語でプログラムを組まないといけないんですよね?

あとVC++のアプリケーションからのコンパイル方法を教えてほしいのですが・・・
DOS窓からなら名前.cを作成できコンパイルできるのですが
VC++2005はc++ファイルしか作れなくて困っています。
290デフォルトの名無しさん:2007/12/05(水) 23:47:36
>>288
>AAA(STR_BB *st)の、STR_BBは構造体でしょうか?
さぁ?
多分charかchar*かじゃないの?勘だけど。
どこかで#defineされてるかtypedefされてると思う。

>>289
>VC++2005はc++ファイルしか作れなくて困っています。
C++とプロジェクトは同じで良いから、
新しい項目→C++ファイル(.cpp)を選んで、ファイル名に「〜〜.c」まで書くか(ファイルがない場合)
既存項目の追加で「〜〜.c」を選択(既にファイルが有る場合)
291デフォルトの名無しさん:2007/12/06(木) 00:31:01
>>290
一応できましたが・・・
なぜデバッグなしでビルドじゃないといけないんでしょうか??
292デフォルトの名無しさん:2007/12/06(木) 01:53:44
>>290
構造体だったようです。
必ずしも、
AAA(struct STR_BB *st)としなくてもいいんですね。
構造体を関数に受け渡す方法を勉強すればいいでしょうか・・ありがとうございました。
293デフォルトの名無しさん:2007/12/06(木) 02:57:33
>>277
どこかスレないでしょうか?
履歴がないのでどこも採ってくれないんですけど…。
294デフォルトの名無しさん:2007/12/06(木) 04:04:36
WindowsXP SP2 VC++6.0で動くプログラムの
共有メモリについて質問があります。

複数プロセス間で参照する共有メモリとして、
メモリマップドファイルを検討しているのですが
以下の認識であっていますでしょうか

・mallocで動的に確保する場合に(3M確保を想定)発生する
 O/Sのページング作業がありませんか?
 (連続した物理メモリを取る為に、メモリの入れ替え作業が
  必要になりファイルにメモリの内容を書いたりする事全般)

・メモリマップドファイルの確保、読み書きは普通のファイル
 より高速らしいですが、普通のメモリ確保とどう違いますか?

・メモリマップドファイルを確保したプロセスが解放せず死亡
 した場合にファイルに書く事はできますか?
・そもそも、メモリを確保する際ページング作業をしない保障はWIndowsではできないのでしょうか?そうだとしたら、ディスクをFlashMemory等のRAMディスクにした場合高速にできますか?

当方、組み込み系システムの詳細設計レベルしかやったことがなく、
共同作業している設計者がダウンした為、初めてWINDOWSで基本設計
しています。
時間的要件があるので、処理時間が特定できないのはマズいのですが・・
295デフォルトの名無しさん:2007/12/06(木) 08:16:16
Windowsのメモリマップドファイルでのメモリ共有って、
そもそもページングファイル(スワップ)使うんじゃなかったっけ?
RAMディスク上のファイル使うか、VirtualAllocExあたり使うかか?

WinXPってRTOSじゃないし重いしで、組み込みのレベルで処理時間特定出来るか微妙な気がするけど。

書いてて思ったんだが、C言語の話でもないし、
Win32APIスレとかの方がちゃんとした回答返って来るんでない?
296デフォルトの名無しさん:2007/12/06(木) 11:30:40
UNIXのTCP通信について質問させてください。
 サーバと接続済みのクライアントがソケットを閉じる前に
一方的に接続を切った場合、サーバプログラムがかって
に終了してしまいます。
 クライアントが一方的に切断した場合でもサーバプログ
ラムが動きつづけるようにするにはどうすればよいでしょ
うか?
297デフォルトの名無しさん:2007/12/06(木) 12:39:27
>>294
>・mallocで動的に確保する場合に(3M確保を想定)発生する
> O/Sのページング作業がありませんか?

ページングが発生する可能性はある
発生させたくなければ、あらかじめ確保しておけばいいんでないか

>・メモリマップドファイルの確保、読み書きは普通のファイル
> より高速らしいですが、普通のメモリ確保とどう違いますか?

メモリマップドファイルに書いた内容は最終的に必ずファイルに出力される
普通のメモリ確保は物理メモリが不足してない限りページングファイルに書き出されない

>・メモリマップドファイルを確保したプロセスが解放せず死亡
> した場合にファイルに書く事はできますか?

誰が書くのん?
ファイルは残ったままなので、別の誰かが続きを書くことはできる

>・そもそも、メモリを確保する際ページング作業をしない保障はWIndowsではできないのでしょうか?

マイコンピュータのプロパティの詳細設定のパフォーマンスの設定の詳細設定の仮想メモリで
ページングファイルを「なし」にすればいいんじゃない?
exeイメージやメモリマップドファイルのページングは無理だけど

>時間的要件があるので、処理時間が特定できないのはマズいのですが・・

例えばページングが起きないとしても、そのメモリがCPUのキャッシュに載ってるか載ってないかでアクセス時間は大幅に変わる
if文みたいな条件分岐も、CPUの分岐予測がヒットするかしないかで処理時間が変動する
処理の実行中に他のプロセス・スレッドにCPUを奪われることもあるし
かなり難しいと思うけどな
298デフォルトの名無しさん:2007/12/06(木) 12:56:38
Windowsで処理時間の特定は無理かと。
CPU、メモリ、チップセット、VGA、HDD…処理速度が変る要因が多すぎる。
仮にそれを統一したとしても、いつLANからパケット飛んできて割り込み入るか
なんて分からないし、誰かが机にぶつかってマウスがちょこっと動いただけでも
処理時間が変る可能性がある。ドライバのバージョンが違っただけでも、システム
全体の処理が変わってくる。
x86 CPUの動作は複雑だし、上のレスにもあるように if 文一つ入るだけで
必要クロックが変わる(バイトコード上は同じであるにも関わらず)。
全てがキャッシュヒットかつ分岐予測が当たった場合のベストケースと、
全てがキャッシュミスかつ分岐予測が外れた場合のワーストケース、くらいなら
頑張れば出せるかもしれない。ただしキャッシュミスした時に、メモリからロード
するのに何クロックかかるかは、チップセットやメモリ次第。

ある特定のプロセスが、プロセス切り替えのコストを除いて純粋に実行されている
時間(クロック)ならある程度絞れるだろうけど、例外が発生しうる可能性は十分に
あるし、完全じゃないね。
299デフォルトの名無しさん:2007/12/06(木) 13:00:18
あとC言語スレだからC言語で書いた場合を想定するけど、分岐予測や
キャッシュヒット、パーシャルレジスタストール(だっけ?)を考慮・制御
するのは、C言語じゃ無理だと思う。
300デフォルトの名無しさん:2007/12/06(木) 14:33:17
標準入力から入力した数字を一桁ずつ配列に格納したいのですが、どうすればいいでしょうか?

123 を
arr[0] = 1
arr[1] = 2
arr[3] = 3
のように格納したいのです。
301300:2007/12/06(木) 14:34:09
>>300
arr[3] = 3 は arr[2] = 3 の間違いです。
302デフォルトの名無しさん:2007/12/06(木) 14:43:20
int arr[3];
scanf("%1d%1d%1d", &arr[0], &arr[1], &arr[2]);
303デフォルトの名無しさん:2007/12/06(木) 14:46:00
どなたかお助けください
http://updas.net/up/download/1196919710.zip
このテキストの暗号/複合化のソースを教えてください
このテキストファイルはXOR暗号されており16進数になっています
KEYは215です
凄腕のかたお願いします
304デフォルトの名無しさん:2007/12/06(木) 14:48:51
スレ違い
というか板違い
305300:2007/12/06(木) 15:00:47
>>302
できました!ありがとうございました!
306デフォルトの名無しさん:2007/12/06(木) 15:05:05
>>296
 クライアントが一方的に切断した場合でもサーバプログ
ラムが動きつづけるようにすれば良い。
307デフォルトの名無しさん:2007/12/06(木) 15:07:39
>>296
SIGHUPとかSIGPIPEとかかな?
308デフォルトの名無しさん:2007/12/06(木) 15:11:19
>>303
rubyだが
file = File.open('c:\test.txt','r')

buf = ""
while tmp = file.read(2)
buf += (tmp.hex ^ 0xd7).chr
end

print buf

これでどうかな?
元に戻すのは正直わからん
309デフォルトの名無しさん:2007/12/06(木) 15:14:54
>>308
(a xor b) xor b を求めてごらん。
310デフォルトの名無しさん:2007/12/06(木) 15:16:01
>>296
* read(), write()のエラーハンドリングを正しく行う
* SIGPIPEがsocket通信というコンテキストで、いつ発生するのか調べる
* SIGPIPEのシグナルハンドラを設定し、適切な処理を行う

SIGHUPって発生したっけ?
311デフォルトの名無しさん:2007/12/06(木) 15:21:39
>>303
module Main (main) where

import System
import Data.Char
import Data.Bits
import Numeric

key :: Int
key = 0xd7

main = do
args <- getArgs
case args of
[infile] -> readFile infile >>=
putStr . map toUpper . encode 0xd7
_ -> error ""

encode :: Int -> String -> String
encode k [] = []
encode k (x:xs) =
showHex (ord x `xor` k) (encode k xs)

312303:2007/12/06(木) 15:24:03
ありがとうございます!
あのC++でお願いできませんか?
だれかー><
313デフォルトの名無しさん:2007/12/06(木) 16:15:35
C言語スレなのにRubywwwwwwww
314デフォルトの名無しさん:2007/12/06(木) 16:46:26
#include <stdio.h>

int main(void)
{
int a,b,c;

a-50;
b=100;
c=a+b;

printf("変数 a の値は %d\n",a);
printf("変数 b の値は %d\n",a);
printf("変数 c の値は %d\n",a);

return 0;
}
プログラム実行結果
変数 a の値は 50
変数 b の値は 100
変数 c の値は 150

と"Cの掟"と言う入門書に書いてました。
なぜprintf関数の最後が三個ともsなのかわかりません。
ためしにコンパイルしてみた所

警告 W8019 c2.c 7: コードは効果を持たない(関数 main )
警告 W8004 c2.c 16:'c'に代入した値は使われていない(関数 main)
Turbo Incremental Lind 5.00 Copyright (c) 1997,200 Borland

とでてきます。
全部意味がわかりません。コンパイラがぶっこわれているのでしょうか?
誰か教えてください!
315デフォルトの名無しさん:2007/12/06(木) 16:48:26
↑訂正
”三個ともa”です。すみません・・・orz
316デフォルトの名無しさん:2007/12/06(木) 16:50:31
誤植じゃね?
317デフォルトの名無しさん:2007/12/06(木) 16:53:24
可能性1:本が間違っている。
可能性2:目の錯覚。本当は2番目と3番目の printf は b と c。
318デフォルトの名無しさん:2007/12/06(木) 16:56:24
私もおそらく本側のミスだとおもいます。
しかしエラーについては少しわかりかねます。
打ち間違えはないものとしてお願いします。
319デフォルトの名無しさん:2007/12/06(木) 16:56:37
タイトルと誤植でググったら、誤植や脱字が多いって評価見っけたから、そこもそうなんだろ。
初心者向けの本での誤植って最悪だな。
320デフォルトの名無しさん:2007/12/06(木) 16:59:05
a-50; → a=50;

printf("変数 b の値は %d\n",a); → printf("変数 b の値は %d\n",b);
printf("変数 c の値は %d\n",a); → printf("変数 c の値は %d\n",c);

に直してみて
321デフォルトの名無しさん:2007/12/06(木) 17:03:22
C言語で小数点第六位以降まで扱う方法はありませんか?
322デフォルトの名無しさん:2007/12/06(木) 17:06:27
float x = 0.0000000001;
printf("%.10f", x);
こうか?
323デフォルトの名無しさん:2007/12/06(木) 17:07:28
>>322
足し算やら掛け算やら演算をさせて表示させたいんですが
できませんか?
324デフォルトの名無しさん:2007/12/06(木) 17:07:33
>>320
ありがとうございました。問題は解決しました。
単純なミスで重々すみませんorz
初心者にありがちなことでめんどくさがらずに教えてくださったみなさまに感謝です。
325デフォルトの名無しさん:2007/12/06(木) 17:09:20
>>323
やってもみないで訊いてるだろ

float x = 0.0000000001;
float y = 0.0000000002;
printf("%.10f", x + y);
326デフォルトの名無しさん:2007/12/06(木) 17:19:27
>>325
いえ、今やっているんですが
なぜか自分のプログラムだと少数点6位までしか表示されなくて・・・
327デフォルトの名無しさん:2007/12/06(木) 17:24:17
>>325
%.10にしたらできました
ありがとうございました
328デフォルトの名無しさん:2007/12/06(木) 23:32:01
gcc バージョン 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)

質問は2つあります。
1)これはスレ違いかも知れませんが
$ man abs
No manual entry for abs

absをmanで調べた時このように出ます。
どうすればいいのでしょうか?

2)関数ポインタについて質問します。
例えば以下のようなサブルーチンを想定します。
double a(double x){
329デフォルトの名無しさん:2007/12/06(木) 23:34:35
ミスりました。

続き

double a(double x){
  return x;
}

これを、これは間違っていると思いますが、

void p(double *a(double)){
printf("%f\n", a(10));
}

のように関数を引数にして他の関数に渡したいのです。
とてもくだらない話かも知れませんが、どうすればいいのか分からないので教えてください。
330デフォルトの名無しさん:2007/12/06(木) 23:50:12
>>329

「関数を引数にして」の意味がわからない。
関数へのポインタを渡したいのか、関数の戻り値を渡したいのか、どっちだ?

もっと言うと、何をしたい?
331デフォルトの名無しさん:2007/12/06(木) 23:57:39
void p(double *a(double)){
printf("%f\n", a(10));
}

これだと、double* までが戻り値の型になるから

void p(double (*a)(double)){
printf("%f\n", a(10));
}

だっけ?
332デフォルトの名無しさん:2007/12/07(金) 00:02:25
#include <stdio.h>
#include <math.h>

double func(double x){
return fabs(x);
}

void print_func(double (*func)(double)){
printf("%f\n", func(-5.5));
}


int main(void){
print_func(&func);
return 0;
}

$ gcc -lm a.c
$ ./a.out
5.500000

出来ました!!!
あじゅじゅしたー


333デフォルトの名無しさん:2007/12/07(金) 00:02:26
いや上記のは戻り値なし だからvoid
334デフォルトの名無しさん:2007/12/07(金) 00:42:51
セレロンか、BCCか分からないけど、float型の演算ってゼロ除算でないのに落ちることがあるね
doubleでは落ちないのに
多分ある程度より小さい数を扱うと0では無いのに0とされてしまう現象があるとおもう
335デフォルトの名無しさん:2007/12/07(金) 00:53:02
>>334
その通りでございます

プログラムは物理的な存在と意識できる瞬間だな
336デフォルトの名無しさん:2007/12/07(金) 00:53:06
fopenで新規作成されたファイルを消すにはどうすればよいのですか?
関数を探してみたのですが、見つけられなかったので教えてください
337デフォルトの名無しさん:2007/12/07(金) 00:55:00
>>336
remove
ただし、誰か(自分自身も含む)がアクセスしていると消えない
338デフォルトの名無しさん:2007/12/07(金) 00:56:14
あと、floatのエラーは、場所が特定されない・・・ 同じ計算なのに、毎回違うところで止まる
339デフォルトの名無しさん:2007/12/07(金) 01:05:04
>>337
ありがとー
340デフォルトの名無しさん:2007/12/07(金) 13:35:02
>>338
サンプル頼む。

>>336
remove()で消えることになっているけれど、実際の動作は環境依存。
Unixだと、>337のようには振る舞わない。
341デフォルトの名無しさん:2007/12/07(金) 15:17:34
文字列としての数字 例えば
123456789
の各桁の数字を順に配列に入れるのってどうするんですか? 例
num[0]=1 num[1]=2
342デフォルトの名無しさん:2007/12/07(金) 15:21:47
const char * str = "123456789";
num[0] = str[0];
num[1] = str[1];
num[2] = str[2];
num[3] = str[3];
num[4] = str[4];
num[5] = str[5];
num[6] = str[6];
num[7] = str[7];
num[8] = str[8];
343デフォルトの名無しさん:2007/12/07(金) 15:27:10
>>342さん ありがとうございます!!早速やってみます
344デフォルトの名無しさん:2007/12/07(金) 15:30:12
>341と等価にするなら、num[0] = str[0] - '0';だな。
つーか、せめてループにしろよw
345デフォルトの名無しさん:2007/12/07(金) 15:45:14
>>341です またすいません
続きですがscanfで文字列を受け取り、それを各桁を配列に入れようと思うのですが、ループの終了条件が解りません。
346デフォルトの名無しさん:2007/12/07(金) 15:46:14
文字列の終端は '\0'
347デフォルトの名無しさん:2007/12/07(金) 15:51:17
>>346さん ありがとうございます!!
348デフォルトの名無しさん:2007/12/07(金) 16:17:37
>>341です
for (i=0;str[i]!='\0';i++)
num[i]=atoi(&str[i]);
で str[6]を見たところ7が欲しいのに789が返って来ます どうすればいいですか?
349デフォルトの名無しさん:2007/12/07(金) 16:31:53
>>348
(その目的で)atoi()しちゃいけません。
350デフォルトの名無しさん:2007/12/07(金) 16:39:12
いずれ各桁について演算をしたいので数データにしたのですが…まずかったのですか…
351デフォルトの名無しさん:2007/12/07(金) 16:40:04
>>348
num[i]=str[i] - '0';
352デフォルトの名無しさん:2007/12/07(金) 16:41:10
scanf に 123456789 を入力されたと仮定
sizeof() で配列の長さを調べる
for で回す
num[0]~[8] までを printf で表示してみる

num[6] なら 7 が来ると予想される
str[6] だから 7 から終端までが表示される

別におかしいところは見当たらない
353デフォルトの名無しさん:2007/12/07(金) 16:42:58
と思ったらatoiか
354デフォルトの名無しさん:2007/12/07(金) 16:46:55
>>348 です すいません 見たのは strでなくnumでした
355デフォルトの名無しさん:2007/12/07(金) 16:49:15
それで num[5] を見たら
6789 が来る
356デフォルトの名無しさん:2007/12/07(金) 16:51:21
>>354
教訓。やりたいことを書かないから
・からかわれる
・おちょくられる
・教えたがりに間違いを教わる
羽目になる。
357デフォルトの名無しさん:2007/12/07(金) 16:52:06
はい
358デフォルトの名無しさん:2007/12/07(金) 16:55:17
やりたいのは、まずは数百桁とかの四則演算等です
359デフォルトの名無しさん:2007/12/07(金) 16:58:12
>>341-346の流れで
>>348になるのは頭がおかしい
360デフォルトの名無しさん:2007/12/07(金) 16:58:32
>>358
数百桁の計算ならGMPライブラリ使えばいいんじゃないの?
361デフォルトの名無しさん:2007/12/07(金) 18:36:33
ひょっとしたら文字列でもひとつの変数に沢山入力するとオーバーフローしますか?
362デフォルトの名無しさん:2007/12/07(金) 18:42:55
double型でおk

1797693134862315708145274237317043567980705675258449965989174768031572607800
2853876058955863276687817154045895351438246423432132688946418276846754670353
7516986049910576551282076245490090389328944075868508455133942304583236903222
948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
363デフォルトの名無しさん:2007/12/07(金) 18:43:55
>>362
有効桁数という言葉をご存知でしょうか?
364デフォルトの名無しさん:2007/12/07(金) 18:53:50
こういう香具師がいるから%fより%gを勧めたくなるんだよな。
365デフォルトの名無しさん:2007/12/07(金) 20:01:15
質問いいですか?
とある本には
main←関数の名前
すなわち関数であるみたいなことがかかれており
とあるHPには
↓のようなものがが関数の構造であると書かれておりました
int main(void) {return 0;}
関数というのは実際どのことをいうのでしょうか?
366デフォルトの名無しさん:2007/12/07(金) 20:30:43
>>365
別にその2つに矛盾は無いと思うが。

普通「関数」という場合、名前も含めたものを指す(>>365の後者)
「関数の構造」のうち、「関数の名前」が「main」。
Cに無名関数はないから、関数の名前≒関数と言えなくもない。

戻り値 
↓      ↓
int main(void)
    ↑
 関数名
367366:2007/12/07(金) 20:32:09
変なとこで書き込んでしまった。

面倒なので…
左から順に戻り値(int)、関数名(main)、引数(void)、関数本体({ return 0; })
みたいな感じかね。
368デフォルトの名無しさん:2007/12/07(金) 20:34:20
>>366
ありがとうございました。

もうひとつ質問いいですか?
たとえば
int main(void) {return 0;}
をビルドするときデバッグなしでビルドにしないとちゃんと起動しません・・・
なぜだか教えてください
369デフォルトの名無しさん:2007/12/07(金) 21:13:50
>>368
そんな質問の仕方で答えが返ってくると思う?
370デフォルトの名無しさん:2007/12/07(金) 21:16:41
どーせ起動してそっこう終了してるんだろ
getchar なり system("pause") なり色々ぐぐってみれば
371デフォルトの名無しさん:2007/12/07(金) 21:20:01
さっきもこんなようなのがいたな
372デフォルトの名無しさん:2007/12/07(金) 21:23:53
スレチかもしれないが、Perlのpack/unpackみたいなことをするには関数を自作するしかない?
373デフォルトの名無しさん:2007/12/07(金) 21:56:14
アラインメントに充分注意したうえで、構造体をchar*とかvoid*にキャスト
するのではいけないのかね?
374デフォルトの名無しさん:2007/12/07(金) 22:01:59
>>370
一文字入力を行うための関数がgetchar()らしいのですが
文字を入力できるようにするためにすぐ終了しないということですか??
375デフォルトの名無しさん:2007/12/07(金) 22:19:36
これはすごい天然
376デフォルトの名無しさん:2007/12/07(金) 23:19:47
>>375
すいません
ではどういうことか教えていただけませんか?
377デフォルトの名無しさん:2007/12/08(土) 01:50:28
sscanfで数値を取り込む際、指定した桁数の数値のみ取り込むことは可能ですか?

例えば
00000000:0000:000000 (8桁:4桁:6桁)
は取り込む
0000:000000:00000000 (4桁:6桁:8桁)
は取り込まない…という感じです。

while(fread(buf, 256, file))
{
matching = sscanf(buf, "%8x:%4x:%6x\n", &a, &b, &c);

if(matching != 3 )
{
continue;
}
else
{
first = a;
second = b;
third = c;
}
}
上記の場合、例えば%8xなら、8桁を越える数値は無視されますが、7桁だと取り込まれますよね?
378デフォルトの名無しさん:2007/12/08(土) 02:14:27
取り込んだ後に捨てればいいじゃん
379デフォルトの名無しさん:2007/12/08(土) 17:45:17
VC2005なんですが、暗号化のライブラリはありますか?md5とかshaとか。
できれば使い方が載っているサイトとか教えてもらえるとありがたいんですが。
380デフォルトの名無しさん:2007/12/08(土) 18:34:05
VC2005のスレ行けばいいじゃない
まさかマルチかね
381デフォルトの名無しさん:2007/12/08(土) 19:43:12
変数アドレスを指すポインタを、配列みたいに扱ってはいけないようですが、何故ですか?
382デフォルトの名無しさん:2007/12/08(土) 19:44:13
変数アドレスは、配列ではないからです
383デフォルトの名無しさん:2007/12/08(土) 20:54:47
以下の処理を最も効率よく行う方法を教えて頂きたいのですが。

@char型の配列[0]〜[3]に"0x01" "0x02" "0x03" "0x04"と格納されている値を、
  0x01020304のデータとしてlong型の変数に格納する。

A上記の逆のケースで、long型の変数に格納されている0x01020304というデータを
  char型の配列0]〜[3]に"0x01" "0x02" "0x03" "0x04"と格納する。

384デフォルトの名無しさん:2007/12/08(土) 20:57:47
union
385デフォルトの名無しさん:2007/12/08(土) 21:01:47
あ、リトルエンディアンだと4321になってしまう orz
386デフォルトの名無しさん:2007/12/08(土) 21:13:53
((ch[0]-'0')<<24)+((ch[0]-'0')<<16)+((ch[0]-'0')<<8)+(ch[0]-'0')

((x>>16)&15)+'0'
387デフォルトの名無しさん:2007/12/08(土) 21:26:35
>>382
すみません。変数アドレスでもポインタを使って配列のように扱えるようですが?
388デフォルトの名無しさん:2007/12/08(土) 22:09:47
htonl( *(u_long*)char_array );
ってのはどうだろ。
389デフォルトの名無しさん:2007/12/08(土) 22:30:15
>>387
もちろん

ただし配列はない場合は、ポインタをインクリメントするとどこを指すかわからない
390デフォルトの名無しさん:2007/12/08(土) 23:12:39
>>388
今時エンディアン気にする必要がある環境だと、
htonlあるかどうか、微妙なんじゃない?
391デフォルトの名無しさん:2007/12/08(土) 23:35:38
constへのキャストってどういう時に使うんでしょうか?
392デフォルトの名無しさん:2007/12/08(土) 23:39:08
よく訓練された初心者地獄だぜフウハハハ
393デフォルトの名無しさん:2007/12/09(日) 00:08:30
>>378
取り込んだ後の桁数判定がどうにも思いつかないんで、ヒントでもいいので教えてもらえませんか?

とりあえず別の方法を考えついたんですが

1 : まず数値を文字列として取り込む
2 : strlenで長さを判定
3 : 一致したら改めてsscanfでその文字列を数値に変換して格納

なんだか思いっきり無駄なような気がしてなりません…
394デフォルトの名無しさん:2007/12/09(日) 00:22:11
>>393

3はsscanfじゃなくてsprintfだな、きっと。


最初は無駄でもいい。
効率より動くことが優先。
正しく動いたら、その後で効率を考えるんだ。
遅くても、動かないコードの無限大まし。
動かないコードは何の役にも立たない。
395デフォルトの名無しさん:2007/12/09(日) 00:29:28
>>393
sscanf()にかけるまえに、文字列がフォーマットどおりか確認すれば?
3行程度でしょ。
396デフォルトの名無しさん:2007/12/09(日) 00:34:54
>>393
8桁以下なら
if(a&0xf0000000)
397デフォルトの名無しさん:2007/12/09(日) 01:07:24
>>389

ありがとうございます!とても参考になりました。
398デフォルトの名無しさん:2007/12/09(日) 12:14:47
サフィックス(接尾子)がよく分かりません。
--------
数値の定数の場合、数値の末尾にアルファベットを付けて、具体的な型を表現することがあります。このアルファベットをサフィックス(接尾子)といいます。
サフィックスは小文字でも大文字でも構いません。「U」と「UL」は整数に、「F」は小数に使います。「L」は整数に使えばlong int、小数に使えばlong doubleとして扱われます。

例)
f = 3.14f; /* float */
f = 3.14; /* double */
f = 3.14L; /* long double */
サフィックスを使わなければ、整数は「signed int」、小数は「double」と判断されます。
--------
と説明があるのですが、意味がよく??

例の中にある、「 f = 」の「変数f」は、元々、flot型として宣言されていて、
f = 3.14L; /* long double */
とした場合、「変数f」が、long double型に変わるということ???
399デフォルトの名無しさん:2007/12/09(日) 13:03:10
変数の型は変わらない。その定数の型を指定するだけ。

例えば
float f, g;
f = .......;
g = f * 3.14;
などと書いたとき、3.14 は double 型なので、 f をいったん double に変換してから 3.14 を掛け、
結果を float に変換し戻して g に代入するという面倒な手順を踏むことになる。
g = f * 3.14f;
と書けば float のまま掛け算する。

long doubleの方は、例えば
long double x = 1.2345678901234567890;
などと書いても、この定数値 1.234.... は double 型の精度であって、long double 型の精度を持った定数ではない。
それでは困るんだよ long double 精度の定数値が必要なんだ、という場合は
long double x = 1.2345678901234567890L;
などとする必要がある。
http://qb5.2ch.net/test/read.cgi/operate/1196529079/749

749 名前:マァヴ ◆jxAYUMI09s [] 投稿日:2007/12/08(土) 17:56:40 ID:mzzKkj6v0 ?PLT(25001)
2007年12月11日の 午前11時00分より 正午まで
サーバセンターでスイッチのメンテナンスを行うんだけど
そのスイッチにぶら下がってるサーバはほとんど2chのサーバだったりする(^_^;)

たぶん、大量に繋がらないサーバが出るはず(^_^;)

752 名前:マァヴ ◆jxAYUMI09s [] 投稿日:2007/12/08(土) 18:05:32 ID:mzzKkj6v0 ?PLT(25001)
>749
日本時間です(^_^;)
401デフォルトの名無しさん:2007/12/09(日) 14:46:53
1変数関数の最小値を求める方法として
黄金分割法をやりたいのですがうまくいきません。
黄金分割法については
http://mikilab.doshisha.ac.jp/dia/research/report/2003/0612/003/report20030612003.html

とりあえず上のアルゴリズムで作ってみた自作ソースは

#include <stdio.h>
#include <math.h>
#define r 0.3819 /*黄金比r*/
#define eps 0.05
#define imax 100 /*回数*/

/*探索する関数の宣言*/

double f(double x)
{
return x*x-50*x;
}

double a=0.0,b=1000.0;
double c,d;
int i=0;
402デフォルトの名無しさん:2007/12/09(日) 14:48:17
int main(void)
{
c=a+r*(b-a);
d=b-r*(b-a);

printf(" a b c d \n");
do{
c=a+r*(b-a);
d=b-r*(b-a);

if(f(c)>f(d)){
printf("if %5f,%5f,%5f,%5f\n",a,b,c,d);
c=d;
a=c;
}

else{
printf("else %5f,%5f,%5f,%5f\n",a,b,c,d);

d=c;
b=d;
}

}while(fabs(d-c)>eps);

printf("x=%f\n",d);
return 0;
}
403デフォルトの名無しさん:2007/12/09(日) 14:49:36
実行すると

a b c d
else0.000000,1000.000000,381.9000000,618.100000
x=381.90000000

みたいになります。

何回も繰り返してほしいのに一回しか繰り返されないので
収束していかないんです。
どこが問題でしょうか?

elseとでてるのはifとelseどっちの処理にいったのか
見たかったので書いただけです。
404デフォルトの名無しさん:2007/12/09(日) 14:51:23
>>399
難しい・・が、ようやく理解したような気がします・・。
数値の後ろに、3.14f や、3.14L のように、サフィックスをつけなければ、
小数は「double」型だとC言語コンパイラに判断されてしまうので、
float型として計算してほしければ、
g = f * 3.14f;
とすればいいってことでしょうか・・・。

・・・基本的なところですが、
f = 3.14; /* double */

と、書いた場合、変数が「f」で、定数が「3.14」になるんでしょうか?
405デフォルトの名無しさん:2007/12/09(日) 15:21:44
> printf("else %5f,%5f,%5f,%5f\n",a,b,c,d);

> d=c;
この時点で、下のwhile条件は成立しなくなるだろ。
d-cは0なんだから。
406デフォルトの名無しさん:2007/12/09(日) 15:30:25
>>405
なるほど、たしかに。
for文とかでも色々試してみましたけど結局
break文にfabs(d-c)>epsを使っていたので
同じ理由で一回しかできなかったようです。
ありがとうございました。
407デフォルトの名無しさん:2007/12/09(日) 16:04:09
>>404
そんな感じ
408デフォルトの名無しさん:2007/12/09(日) 16:22:57
>>407
なるほど・・ありがとうございます。
「具体的な型を表現することがあります。」
と書いてあるのは、「(末尾にアルファベットをつけた時だけ)具体的な型に一時的に変換できます」
ってことですね。「ことがあります」ってことは、できないこともあるんでしょうか?
409デフォルトの名無しさん:2007/12/09(日) 16:50:05
i++
と、
++i
はどう違うんですか?
410デフォルトの名無しさん:2007/12/09(日) 16:53:16
>>409
i = 1;
n = i++;
printf("%d %d\n", n, i); 
結果
1 2

i = 1;
n = ++i;
printf("%d %d\n", n, i);
結果
2 2
411デフォルトの名無しさん:2007/12/09(日) 16:54:22
一緒 自分の好みで書くがよろし
どっちかと言うと、i++を使う人の方が多いかな
412デフォルトの名無しさん:2007/12/09(日) 16:57:04
>>409
昔それで撃沈したコテハンが居た
413デフォルトの名無しさん:2007/12/09(日) 16:57:53
書いた後に>>410みたいなパターンがあったる事に気付いた…
単純に値を増やす場合はどっちでもいいけど、
別の変数に代入する場合は、>>410みたいに先加算と後加算というふうに使い分けできるよ
414デフォルトの名無しさん:2007/12/09(日) 17:10:47
よくは分かりませんが、
=より+の方が優先順位が低いから、
n = i++;
の場合、先にiがnに代入されてしまって、その後iが+1される、
と考えていいんでしょうか・・・
415デフォルトの名無しさん:2007/12/09(日) 17:16:10
typedef long int time_t;

というのはどういう意味ですか?
416デフォルトの名無しさん:2007/12/09(日) 17:29:42
n=i++ は
n=i
i++;

n=++i は
i++
n=i
になる

単体でのi++と++iの記述は同じ意味だから

n=i++ は
n=i
++i

n=++i は
++i
n=i
と買いても同じことを表す…分かりづらいなw
417デフォルトの名無しさん:2007/12/09(日) 17:41:03
>>416
n = ++i;
と、
n = (i++);
は同じになるんですかね?
418デフォルトの名無しさん:2007/12/09(日) 17:43:32
>>408
「ことがあります」ってのは、必要に応じてプログラマがそのように書くことがありますってことだよ
419デフォルトの名無しさん:2007/12/09(日) 17:45:56
>>415
long int 型に time_t という新しい名前をつける。

long int x;
と書くところを、
time_t x;
と書くことが出来るようになる。
420デフォルトの名無しさん:2007/12/09(日) 17:47:27
>>418
!!
主語はプログラマーだったのか!!
分かりにくい・・・「〜と書くと、〜という意味としてコンパイラに判断されます」
みたいな初心者向けの説明がよかったにょ・・・orz

ともあれ、大変助かりました。ありがとうございました。
421デフォルトの名無しさん:2007/12/09(日) 17:52:01
>>419
なるほど。
time_t が新たな型の名前になるんですね。
「time_t」が「log int」の別名として使える有効範囲は、

typedef long int time_t;

の表記のあるファイル内と考えてよいでしょうか?
422デフォルトの名無しさん:2007/12/09(日) 17:54:37
errno_t nErr = 0;

ってどういう意味ですか?
すんごいたくさん見かけるんですが、どこかで#defineされてる様子もなく・・・
423デフォルトの名無しさん:2007/12/09(日) 18:01:40
>>420
ローカル変数みたいに、関数の中に typedef があれば、その関数内に限る
グローバル変数みたいに外にあれば、ファイル全体
424デフォルトの名無しさん:2007/12/09(日) 18:07:48
425デフォルトの名無しさん:2007/12/09(日) 18:08:23
423まちがえた、>>421 ね
426デフォルトの名無しさん:2007/12/09(日) 18:17:12
>>417
優先順位の問題じゃないので、括弧の有無は影響しない。

i = 1 の場合、
i++ を評価した結果は 1 で、それとは別に副作用として i の値を 1 増やす (i=2にする) 効果がある。
++i を評価した結果は 2 で、それとは別に副作用として i の値を 1 増やす (i=2にする) 効果がある。

n = ++i; と n = (i++); は異なる。なぜなら i++ と ++i の評価結果は異なるので、nに代入される値が変わる。
n = i++; と n = (i++); は一緒。なぜなら括弧の有無は影響しない。
i++; n = i; と ++i; n = i; は一緒。なぜなら i++ と ++i の評価結果は異なるが、それをどこにも代入しないのでその違いに意味はない。副作用だけを利用する例。
427デフォルトの名無しさん:2007/12/09(日) 18:17:45
>>423
なるほど。ありがとうございます。
428デフォルトの名無しさん:2007/12/09(日) 18:37:55
>>424
ありがとうございます。。
ですが、errnoって何でしょう?いろいろググったんですが、
どうにもよく分からず・・・
429デフォルトの名無しさん:2007/12/09(日) 18:45:01
>>428
open()とか低水準関数を使ってエラーになったときに、エラーの種類がセットされる変数
430デフォルトの名無しさん:2007/12/09(日) 18:55:36
UNIX系のC言語ではテキストモードとバイナリモードの区別がないと書いてあるんですが、
そうすると、バイナリで書き込みたい場合、UNIXCではどうするんでしょうか?(スレ違いでしたらすみません)
431デフォルトの名無しさん:2007/12/09(日) 18:58:34
バイナリモードで書き込めば良い
432デフォルトの名無しさん:2007/12/09(日) 18:59:18
>>430
Windowsで、テキストモードってのは、書き込みのときに \n が \r\n に変換されて、
読み込みのときは \r\n が \n に変換されるって動作をする。
バイナリだと、変換が行われないで、\n は \n のまま読み書きされる。

unix系だと、テキストでもバイナリでも\n の変換が行われないって動作になる。
433デフォルトの名無しさん:2007/12/09(日) 19:06:46
>>431-432
そうすると、UNIXでは、バイナリファイルも、テキストエディタで人間に
読まれちゃうのでしょうか?
つまり、Windowsだと、バイナリファイルをテキストエディタで開くと、

ミAタシ燧,ゥ゙R・ニ

みたいな感じで読めないじゃないですか。それがUNIXだと全部読まれてしまう??
434デフォルトの名無しさん:2007/12/09(日) 19:09:08
>>433
それはない
一緒
435デフォルトの名無しさん:2007/12/09(日) 19:14:49
>>433
テキストファイルって言っても、単に文字コードの範囲で数値が書き込まれてるバイナリファイルだから。
バイナリファイルって言われてるのは、文字コードとか関係なしで数値が書き込まれてるから、
テキストエディタで開いても読めない。
436デフォルトの名無しさん:2007/12/09(日) 19:16:09
>>429
ありがとうございます。低水準入出力関数というのを調べたんですが、
使用するためには、<io.h>をインクルードする必要があるらしく、どう探しても、
io.h はどのプロジェクトでもインクルードされていないし、

errno_t nErr = 0;

の記述のあるファイルでも、低水準関数は一度も使われてないようなんです。
そうすると、
「errno のエラーコードを処理する関数の戻り値の型またはパラメータに使用され」
るという、errno_t は、ここではどういう役割になるんでしょう?

そもそもこの↓文法がよく分かりません。

errno_t nErr = 0;

nErr も、errno_t も、どこにも宣言がなく、突然使われてるようなんです。orz
437デフォルトの名無しさん:2007/12/09(日) 19:20:34
>>433
たとえば、アスキーコードで「1」は0x31だから、バイナリモードでも、テキストモードでも、
数値の0x31を書き込んで、テキストエディタで開くと「1」が表示される。
数値の0x1とか0xffとかは通常の表示できる文字コードじゃないから、それを書き込んで、エディタで
開いても、読める文字は表示されない。
438デフォルトの名無しさん:2007/12/09(日) 19:28:31
>>436
errno_t というのはC99になってから、新しく導入された型っぽいね。
strcpy_s()とか、安全な関数のリターン値の型になってた。
439デフォルトの名無しさん:2007/12/09(日) 19:37:07
>>436
>そもそもこの↓文法がよく分かりません。 
>errno_t nErr = 0; 

文法は
int x = 0;
と同じ。それ自体が nErr の宣言だ。
errno_t は >>424 に stddef.h、crtdefs.h って書いてあるだろ。
その中見てみれ。
440デフォルトの名無しさん:2007/12/09(日) 19:38:21
>>437
なるほど。。。そういうことですね。
では、

「今日の日付:12月9日」

みたいな文章を、.datファイルにバイナリで書き込みたい場合は、
UNIXCだと、どうするんでしょう?
441デフォルトの名無しさん:2007/12/09(日) 19:40:29
fp = fopen(".dat", "wb");
fprintf(fp, "今日の日付:12月9日");
fclose(fp);
442デフォルトの名無しさん:2007/12/09(日) 19:47:59
ファイルが終了するまで繰り返す場合
繰り返しの条件式はどうすればいいのでしょうか?
443デフォルトの名無しさん:2007/12/09(日) 19:53:36
ファイルをgetcかfgetcかfscanfで読み込んでいる場合は、その戻り値がEOFだったら終了
ファイルをfgetsで読み込んでいる場合は、その戻り値がNULLだったら終了
444デフォルトの名無しさん:2007/12/09(日) 19:56:50
>>438
そうか、なるほど!
MSDN をよく見たら、「errno_t整数」の上に、「型」って書いてありますね。
これは整数型で、今まで、errno に入れられていたエラーコードを入れるために
用意された新しい型なんですかね?

>>439
stddef.h には、

#define errno (*_errno())

って書いてありました。
(*_errno())
こ、、、これは一体・・・・?


CRTDEFS.H には、こう↓ありました。

#if !defined(__midl)
_CRT_DEPRECATE_TEXT("This name was supported during some Whidbey pre-releases. Instead, use the standard name errno_t." ) typedef int errcode;
#else
typedef int errcode;
#endif

typedef int errno_t;
#endif



errno_t はつまり、int だと思っていいんでしょうか?
445デフォルトの名無しさん:2007/12/09(日) 19:58:52
>>441
b をつけることは変わらないんですね。それで、区別させるということですね。
納得しました。ありがとうございました。
446デフォルトの名無しさん:2007/12/09(日) 20:04:06
>>444
>errno_t はつまり、int だと思っていいんでしょうか? 

わざわざ新しい名前を導入してまで本来の型を隠してるんだから、errno_t 型は errno_t 型だと思っておくべき。
将来のバージョンで long に変わるかもしれんし (ないだろうけど)。
447デフォルトの名無しさん:2007/12/09(日) 20:12:19
実行ファイルの上にD&Dしたファイルを開こうと
fp = fopen("argv[1]", "r")
としたのですが、これでは開けませんでした
どのようにすればいいのでしょうか
448デフォルトの名無しさん:2007/12/09(日) 20:13:23
× fp = fopen("argv[1]", "r")
○ fp = fopen(argv[1], "r")
449デフォルトの名無しさん:2007/12/09(日) 20:13:27
>>447
fp = fopen(argv[1], "r");
450デフォルトの名無しさん:2007/12/09(日) 20:13:50
>>443
ありがとうございます
451デフォルトの名無しさん:2007/12/09(日) 20:16:12
>>448-449
すばやい返答ありがとうございます!
452デフォルトの名無しさん:2007/12/09(日) 20:55:28
#define NUM (100)

という例題があるんですが、何故( )をつけるんでしょうか?

#define errno (*_errno())

で、*_errno() を囲ってる ( ) と同じ意味でしょうか?
453デフォルトの名無しさん:2007/12/09(日) 20:58:00
100NUM ⇒ 100100
100NUM ⇒ 100(100)
454デフォルトの名無しさん:2007/12/09(日) 21:10:41
>>452
こうやって使うため

#include <stdio.h>
#define NUM (100)

int twice(int x){
return 2*x;
}

int main(){
printf("%d",twice NUM);
return 0;
}
455デフォルトの名無しさん:2007/12/09(日) 21:21:18
>>454
計算式用に作ったものだから、計算がおかしくならないようにするため・・・
で合ってますか?

ちなみにこれ↓はどういう意味でしょう?マクロ名・・・ではないですよね?

#define TRUE !FALSE
456デフォルトの名無しさん:2007/12/09(日) 21:24:18
>>455
>#define TRUE !FALSE
おそらく別の所でFALSEがdefineされてる
(きっと#define FALSE 0)
!演算子は知っているよね?
FALSEの論理反転をTRUEと定義している
457デフォルトの名無しさん:2007/12/09(日) 21:31:00
べつに
#define TRUE 1
#define FALSE 0
でいいけどな。
458デフォルトの名無しさん:2007/12/09(日) 22:01:04
ちょっと今気になったことがあったのでいいですか??
#include<stdio.h>はprintf関数を使えるようにする命令なのに
VC++で#include<stdlio.h>を抜いても
ちゃんと文が表示されるのです。
#includeの意味っていったい・・・
459デフォルトの名無しさん:2007/12/09(日) 22:02:52
#include<stdlio.h> なんてありません
460デフォルトの名無しさん:2007/12/09(日) 22:08:14
スペルミスです
stdio.hですね・・・
461デフォルトの名無しさん:2007/12/09(日) 22:14:58
>>458
afxなんとかとかってインクルードしてるとか?

Cとしてコンパイルしてたら、プロトタイプなしでもコンパイルはできるね。
462デフォルトの名無しさん:2007/12/09(日) 22:35:17
>>461
afxなんとかってなんですか??
Cとしてコンパイルしてましたが・・・
プロトタイプなしってどういうことですか??

ちなみに文は
#include<stdio.h>

int main(void)
{
printf("aaaa");
return 0;
}
の練習文でやったのですが・・



463デフォルトの名無しさん:2007/12/09(日) 22:42:20
>>462
プロトタイプってのは、関数のリターン値とか引数の型が定義されてる文で、
stdio.h の中で、標準入出力の関係のプロトタイプが書かれてるから、
プログラム中で、引数やら間違えると、エラーになるって仕組み。

C++はプロトタイプがないとエラーになるけど、Cはなくてもコンパイルと実行ができる。
(そのかわり、引数の型やら数を間違えてると、実行時落ちる)

ちなみに、そのコードは、なにを参考にして書いたの?
464デフォルトの名無しさん:2007/12/09(日) 22:46:03
>>463
ということは書いといたほうがいいわけですね
ちなみに引数はさっきの文でいうと(void)ってことですかね??

えーと
HPです
465デフォルトの名無しさん:2007/12/09(日) 22:50:34
>>464
main()の引数はvoidだね。
ptintf()は違う。

> #include<stdio.h> 
最近、こういう書き方のコードをちょくちょく見るんで、どっかで広めてるやつがいるのかなと思って訊いた。
466デフォルトの名無しさん:2007/12/09(日) 22:58:11
>>464

書いといたほうがいい。

なお、
#include
は、「ファイルxxxの中身を、ここに取り込む」という意味。
それをプリプロセッサが解釈して、ファイルの中身を展開する。
コンパイラにプリプロセス処理をするだけのオプションがあるだろうから、
それでプリプロセス処理したファイルを吐き出させてみるとよくわかるよ。
467デフォルトの名無しさん:2007/12/09(日) 22:59:26
>464
HP-UXと申すか。
468デフォルトの名無しさん:2007/12/09(日) 23:04:54
お前ら初心者を混乱さすなよw
469デフォルトの名無しさん:2007/12/09(日) 23:06:25
すまん誤爆
470デフォルトの名無しさん:2007/12/09(日) 23:49:37
>>465-466
とりあえずつけといて問題ないってことですね
プリプロセス処理って文字の調整??みたいな感じじゃなかったですか?
471デフォルトの名無しさん:2007/12/10(月) 01:05:55
なにおまいら難しい話を入門者に叩きつけてんだよ
プリプロセッサだのプロトタイプだのそんなの分かるわけないだろ
472デフォルトの名無しさん:2007/12/10(月) 02:48:31
>>458>>462
そのコードの#include <stdio.h>をコメントアウトしたら
warning C4013: 'printf' undefined; assuming extern returning int
の警告が出力されたので、プログラムが完成していないように見えるけど?
473デフォルトの名無しさん:2007/12/10(月) 08:18:24
>>472

warningは「"printf"の宣言が無いから、とりあえずintを返す関数と思っておくよ」と言っている。
printfの戻り値(intだけど)を何も使ってないので、動作に影響は出ないはず。
474デフォルトの名無しさん:2007/12/10(月) 08:33:58
なあ、もしかして、プロトタイプ宣言さえ書かなければ、
別の翻訳単位にある関数を引数の数めちゃくちゃとかで呼べたりするのか?
475デフォルトの名無しさん:2007/12/10(月) 08:56:07
>>474

呼べると思うが、まともに動かないと思われ。
476デフォルトの名無しさん:2007/12/10(月) 08:56:11
大昔のCプログラムは
main() {
 char *malloc();
 int *p = (int *)malloc(size);
 ...
}
なんて書かれ方をしていた。

で、これが通るように考慮されて規格が定められた。
477デフォルトの名無しさん:2007/12/10(月) 18:40:45
主にコード修正のコーディングの仕事が回されそうなんですが、
なんか良さそうなバイブル本みたいな本無いですか?
478デフォルトの名無しさん:2007/12/10(月) 19:05:31
>>476
それやったらローカルでプロトタイプ宣言されるのかと思ったら、グローバルで宣言されてるのな(bcc)
479デフォルトの名無しさん:2007/12/10(月) 22:55:25
char c = 0xaa;
printf("c = %x",c);

とするとc = ffffffaaと表示されるのをc = aaとするにはどうすればいいのですか?
480デフォルトの名無しさん:2007/12/10(月) 22:58:03
>>479
printf("c = %x",(unsigned char)c); 
481デフォルトの名無しさん:2007/12/10(月) 23:23:23
>>456-457
レス遅れまくってすみません。ありがとうございました。

>#define TRUE !FALSE
の ! だけは、「でなければ」という意味の演算子としての役割なんですね。
ちなみに、「!FALSE」という名前を、「TRUE」の別名として定義したい
場合にはどうすればいいのでしょう?(演算子と文字列の区別のつけ方として・・)
482デフォルトの名無しさん:2007/12/10(月) 23:28:55
>>480
printf("c = %hhx", c); // C99

>>480
可変個引数関数では既定の実引数拡張の規則にしたがって、
unsigned charはintに昇格されるから、そのキャストは意味がない。
483デフォルトの名無しさん:2007/12/10(月) 23:30:51
>>482
unsigned にしたら、符号拡張がなくなるから、ffffffがなくなるんじゃないの?
484デフォルトの名無しさん:2007/12/10(月) 23:58:35
これ↓は、どんな処理をしているんでしょうか?

unsigned char *ABC;
int i;


struct Struct_HensuMei {
    unsigned char Member_Mei[12] ;
     ・
     ・
     ・
} ;

.
.
.

  for(i=0; i<6; i++)
  {
      Struct_HensuMei.Member_Mei[i] =
          ((ABC[i*2+0] << 4) & 0x00f0)
          | (ABC[i*2+1] & 0x000f);
  }
485デフォルトの名無しさん:2007/12/11(火) 00:02:56
>>484
すみません。構造体定義が抜けていました。

unsigned char *ABC;
int i;


struct Struct_HensuMei {
    unsigned char Member_Mei[12] ;
     ・
     ・
     ・
} ;

struct Struct_HensuMei Struct_HensuMei;





  for(i=0; i<6; i++)
  {
      Struct_HensuMei.Member_Mei[i] =
          ((ABC[i*2+0] << 4) & 0x00f0)
          | (ABC[i*2+1] & 0x000f);
  }
486デフォルトの名無しさん:2007/12/11(火) 01:07:44
超初心者な質問なんですが、お願いします。

大学でやってるCを自宅でもやりたいと思ってるんだけど、
そういうのを自宅でやるのはどうすればいいの?
できれば無料でやりたいんだけど、
どんなソフトをインストールすればいいのか教えてください。

大学ではUNIXとか使ってます。
487デフォルトの名無しさん:2007/12/11(火) 01:19:35
超初心者は金で大学の人を雇ってやってもらうのが一番いいよ
488デフォルトの名無しさん:2007/12/11(火) 01:21:19
489デフォルトの名無しさん:2007/12/11(火) 01:30:31
独習Cでも買えばいいんじゃないの
490デフォルトの名無しさん:2007/12/11(火) 01:31:44
あ、無料で欲しいのか
じゃあ、少しは苦労しろ
491486:2007/12/11(火) 02:20:07
レス下さった方々、ありがとうございます。

>>488
見てみたんですが、どれを落とせばいいのか分からないです・・・。
無料でできるのはどれか教えていただけませんか?

そもそも、C言語始めるのに必要なものって何なんですか?
コンパイラとか良く分からないんですけど・・・。
492デフォルトの名無しさん:2007/12/11(火) 02:27:13
まず英語の勉強から頑張れば?
493デフォルトの名無しさん:2007/12/11(火) 02:32:23
>>491
そういうことを学ぶために学校行ってるんじゃねーの?
大抵クラスに詳しい奴の一人や二人は必ずと言っていいほどいるから
そういう奴と友人になるチャンスに恵まれてるのも学校のいいところ
494デフォルトの名無しさん:2007/12/11(火) 02:38:07
文字型配列の中の数値のみを整数型に変換したいのですがatoiを使ってできるんでしょうか?

配列内には文字として数値の他に演算子も文字として定義されているのですが・・。

演算子はifを使って処理はできているのですが数値変換だけうまくいかないものでお聞きしたいです。
495デフォルトの名無しさん:2007/12/11(火) 03:58:33
496デフォルトの名無しさん:2007/12/11(火) 07:40:24
>>494

atoiは、数字以外の文字に出会ったらそこで呼び出し元に戻る。
そこをうまく使えば可能。
497デフォルトの名無しさん:2007/12/11(火) 09:10:58
>>484
見たままとしか・・・。
charの配列からそれぞれ下位4ビットを取り出して並べてる。
上手く言えないなぁ。

((0x31 << 4) & 0x00f0) | (0xfa & 0x000f);
=> 0x1a
498デフォルトの名無しさん:2007/12/11(火) 13:06:27
>>496
そういうときこそstrtol()の出番ですぜ。
499デフォルトの名無しさん:2007/12/11(火) 13:55:19
for (; (ch=fgetc(fp)) != '@'; total++)

for (; ch=fgetc(fp) != '@'; total++) または for (; (ch=fgetc(fp) != '@'); total++)
で、上ではループのたびにchにfgetcしたものが入っていたのですが、下ではchに入っておらず、ループの条件は正常でした。
なぜ下では代入されないのでしょう?
500デフォルトの名無しさん:2007/12/11(火) 13:59:07
(ch=fgetc(fp)) != '@';
ch=fgetc(fp) != '@';
ch=(fgetc(fp) != '@');
501デフォルトの名無しさん:2007/12/11(火) 14:01:24
>>499
演算子には優先順位というものがあって、
==は=よりも優先順位が高い
for (; ch=fgetc(fp) != '@'; total++)

for (; ch= (fgetc(fp) != '@'); total++)
と解釈される。
代入演算子(=)は右辺の値を返すので条件としては正常

演算子の優先順位を全て覚える必要は無いが、
代入演算子はほぼ全ての演算子より優先順位が低い、ということくらいは覚えておいた方がいい
502デフォルトの名無しさん:2007/12/11(火) 14:06:36
>>500->>501
素早い返答ありがとうございます
よく分かりました!
503デフォルトの名無しさん:2007/12/11(火) 14:07:43
助けてください.下記のようにはできないのでしょうか?
わけわからなくなっています.
struct A{
double (*f[100])(double);
(double *)(*funk)(double);
};

void function(){
struct A hoge;

hoge->funk=hoge->f[0];

return;
}
504デフォルトの名無しさん:2007/12/11(火) 14:11:07
間違いました.こうでした.
struct A{
double (*f[100])(double);
(double *)(*funk)(double);
};

void function(struct A *hoge; ){

hoge->funk=hoge->f[0];

return;
}
505デフォルトの名無しさん:2007/12/11(火) 14:11:55
>>503
そうしたいならキャストすれば?
506デフォルトの名無しさん:2007/12/11(火) 14:14:45
>>504
どうみても型が違うじゃん
507デフォルトの名無しさん:2007/12/11(火) 14:23:45
>>504
funkの指すものを関数のポインタ配列fの先頭アドレスにしたいのです.
構造体の宣言から間違っているでしょうか?
508デフォルトの名無しさん:2007/12/11(火) 14:26:15
間違ってます。
509デフォルトの名無しさん:2007/12/11(火) 14:34:57
>>508
今,構造体の宣言のなかで
(double *)(*funk)(double); ではなく
double (**funk)(double);にして
関数内で
math->funk=math->f;
としたらコンパイル通りました.
正直理屈がわかりません.ただ,ヒントをありがとうございます.
考えて見ます.
510デフォルトの名無しさん:2007/12/11(火) 14:42:07
(double *)(*)(double) 戻値型がdouble*で引数が(double)の関数へのポインタ
double(**)(double) 戻値型がdoubleで引数が(double)の関数へのポインタへのポインタ
double (*[100])(double) 戻値型がdoubleで引数が(double)の関数へのポインタの配列[100]
511デフォルトの名無しさん:2007/12/11(火) 15:05:27
>>510
ありがとうございます.
ようやく理解できました.
512デフォルトの名無しさん:2007/12/11(火) 15:21:05
関数ポインタ int (*hoge)(const void *a, const void *b) を返す関数の宣言っ
てどう書けば良いんでしょうか?

下記はダメでした.

int (*)(const void *a, const void *b) get_hoge()
{

}
513デフォルトの名無しさん:2007/12/11(火) 15:27:09
(int (*)(const void *a, const void *b)) get_hoge()
514デフォルトの名無しさん:2007/12/11(火) 15:45:30
typedefした方がスッキリ

typedef int (*PFNFUNC)(const void *, const void *);
PFNFUNC get_hoge() { }

仕組みの勉強としては>>513の方が明確だけどね
515デフォルトの名無しさん:2007/12/11(火) 16:14:35
int (*get_hoge())(const void *a, const void *b)
516デフォルトの名無しさん:2007/12/11(火) 16:27:40
質問です。
C言語のプログラムの中から別のプログラム(コンソールで動く実行ファイル)を呼び出したいです。
別プログラムは他言語で作られているため、ソースをincludeして使うとかではなく、
既にexeとして生成されたものをただ呼び出して使いたいです。

int main(){
execl("program.exe",/*〜その他引数を羅列〜*/,NULL);
printf("完了\n");
}

このようにexecl関数で実行することができるのですが、
この方法だと元のプログラムのプロセスが終了されてしまうようです。
(この場合、次の行のprintfは実行されません。)
別プログラムを呼び出して、また元プログラムに戻る方法があったら教えてください。
517デフォルトの名無しさん:2007/12/11(火) 16:34:51
>>516
fork()
518デフォルトの名無しさん:2007/12/11(火) 16:35:36
質問です

f(x)=ax^4+bx^3+cx^2+dx+e としたとき
f(f(x)) の展開式を求めたいのですが
都合の良いコマンドはないでしょうか?

ちなみにa〜eは数値でも可(但し1以外で全部バラバラ)です

powも考えたのですが、xには値を入れたくないので無理でした
519デフォルトの名無しさん:2007/12/11(火) 16:37:56
標準ではないな
ググるか作れ
520デフォルトの名無しさん:2007/12/11(火) 16:46:41
>>517
ぐぐって調べてみたら、fork()はUNIX専用のようです。

コンパイラがWindowsでのbcc32なので、この関数自体実装されていないようで。
これに代わる方法ありませんか?
521デフォルトの名無しさん:2007/12/11(火) 16:49:17
>>516
CreateProcess
522デフォルトの名無しさん:2007/12/11(火) 16:58:08
>>520
system()じゃ駄目なの?

>>518
マルチ乙
523デフォルトの名無しさん:2007/12/11(火) 17:08:55
>>518
mathematica
524デフォルトの名無しさん:2007/12/11(火) 17:28:08
>>522
ありがとうございます!
system()を使ったらあっさり解決できました!
525デフォルトの名無しさん:2007/12/11(火) 20:10:05
今、二分木構造を勉強してるんですけど
関数の中身がなんなのかいまいちよく分かりません。
どなたか、木構造で主に必要な関数
にどんなものがあるか教えてもらえませんか?
526デフォルトの名無しさん:2007/12/11(火) 21:00:21
>>497
その「見たまま」をもう少し日本語で!
ビット演算子とかよく分かりません。これは何をしてる処理なんでしょうか?
527デフォルトの名無しさん:2007/12/11(火) 21:13:26
その前に2進数、10進数、16進数は分かるのか?
528デフォルトの名無しさん:2007/12/11(火) 21:16:45
>>526
それはビット演算子が「分からない」んじゃなくて
ビット演算子を「知らない」だけじゃないのか?
もしそうならぐぐれ
529七誌:2007/12/11(火) 22:12:38
画像の任意(指定)してその部分だけを出力するにはどうしたらいいですか?
530デフォルトの名無しさん:2007/12/11(火) 22:46:41
Windowsならbitbltでも使えば?
531デフォルトの名無しさん:2007/12/12(水) 02:39:10
#include <stdio.h>
#include <stdlib.h>
int main(void)
{int f,h,i,j,k,l;
int count[25];
char str[1024];
FILE *infp,*outfp;
if((infp=fopen("in.txt","r"))==NULL)
{ printf("ファイルを開けません。");
exit(EXIT_FAILURE); }
if((outfp=fopen("out.txt","w"))==NULL)
{ printf("ファイルを作成できません。");
exit(EXIT_FAILURE); }
for(h=0;h<=25;h++)
{count[h]=0;}
while(fgets(str,1024,infp)!='\0')
for(j=65,k=0;j<=90,k<=25;j++,k++)
{
for(i=0;i<=256;i++)
{if(str[i]==j || str[i]==j+32)
{count[k]++;}
else if(str[i]=='\0')
break; } }
for(f=0,l=97;f<=25,l<=122;f++,l++)
{fprintf(outfp,"%c: %d個\n",l,count[f]);}
fclose(infp);
fclose(outfp);}

in.txtのテキストデータの各文字(大文字小文字区別せず)の文字数をカウントし、out.txtに出力するプログラムなんですけど
fprintfがうまく機動しません。printfだったらきれいに表示されるのに… ファイルの操作難しいっすね
532デフォルトの名無しさん:2007/12/12(水) 02:41:29
そうですね
533デフォルトの名無しさん:2007/12/12(水) 02:52:18
>>531
printfでもfprintfでもちゃんと表示されたけど?ただ、 z の個数があってないみたいだが。

つか、マジックナンバーはやめようぜ。65は'A'にすべき。
534デフォルトの名無しさん:2007/12/12(水) 03:03:47
>z の個数
count[25]が原因か
535デフォルトの名無しさん:2007/12/12(水) 03:13:23
いつのまにかアルファベットは25文字になったのか
536デフォルトの名無しさん:2007/12/12(水) 11:09:01
>>535
0-25だから26回回ってると思うよ^^;
537デフォルトの名無しさん:2007/12/12(水) 11:09:53
>>536
宣言が25ね。
538デフォルトの名無しさん:2007/12/12(水) 11:16:35
いままでBASICやってたやつだな。
539デフォルトの名無しさん:2007/12/12(水) 19:34:54
C言語始めて1ヶ月の超初心者なんですが、学校で勤怠計算のプログラムを作るよう言われました。
勤怠表をcsvファイルで作り、ファイル入出力で

社員番号 氏名 基本給 手当 通勤費 日数 残業代 総労働時間 総合計金額

を読み込み?基本給と手当と通勤費と日数と残業代と総労働時間から
総合計金額を出すプログラムを作りたいのですが、総合計金額を出す条件式が分かりません。
残業代は基本給の1.35/160(月のトータルの基本時間)で計算するのは分かっているのですが
どうやって条件式を書いたらいいのか分かりません・・・。

先生に聞いてもヒントをくれるだけで、そのヒントも分かってる人前提で話しているので
意味が分かりません。 どなたか教えて下さい。よろしくお願いします。
ちなみに使ってる環境はwindows XP コンパイラはgccです。
540デフォルトの名無しさん:2007/12/12(水) 19:50:32
通勤費は全額出してくれるのかね
まあ普通の会社だな
541デフォルトの名無しさん:2007/12/12(水) 20:13:34
ちゃんと残業代出してくれるんだね
いい会社だな。
542デフォルトの名無しさん:2007/12/12(水) 20:16:35
二重帳簿かもしれないな
もう一つの帳簿のデータが無いと完璧とはいえない
543デフォルトの名無しさん:2007/12/12(水) 20:16:39
残業代のでない会社だって、支給項目自体はあるだろ
544デフォルトの名無しさん:2007/12/12(水) 20:26:18
残業単価=基本給*1.35/160;
総合計金額=基本給+手当て+通勤費+残業単価*(総労働時間-160);
545539:2007/12/12(水) 20:36:52
ありがとうございます。
これはif文で書けばいいのでしょうか?
ちなみに10人分の総合計金額を出さなくてはいけないのですが
10人目までwhile文で繰り返してbreakでいいのでしょうか・・。
分からないループに入って頭真っ白です。
546デフォルトの名無しさん:2007/12/12(水) 20:45:52
539を教育する費用も大変なものだと思った
547デフォルトの名無しさん:2007/12/12(水) 20:55:11
>>545
csvに10人分入ってるなら、EOFまで読めば?
548デフォルトの名無しさん:2007/12/12(水) 22:01:45
C言語で組んだコンソールプログラム内で、
Excelファイルのデータを読み込む方法ってありますか?(csvではなく、xls)
ぐぐってみると、VC++などで読み込む方法はいくつか解説されているのですが、
その他の環境でそれをすることは可能でしょうか?
VC++のほうの解説だと、Office2000やXPがインストールされた環境でのみ動作するようですが・・・

使用しているコンパイラはBorlandのbcc32です
549デフォルトの名無しさん:2007/12/12(水) 22:06:53
>>548
特殊なライブラリーがなければダメでしょ
ExecelファイルをCSV出力してそれをよめば?
550デフォルトの名無しさん:2007/12/12(水) 22:34:53
COM呼び出せばいいよ
551デフォルトの名無しさん:2007/12/12(水) 23:23:58
Excelには、COMコンポーネントとして、プログラムからExcelを操作するAPIが存在する。
COMの扱いはBCCよりVC++が長けているので、そっちでの解説が多いのは当然。
けどBCCでも不可能ではない。ただ、いずれにせよCでは面倒。せめてC++は欲しい。当然、実行環境にExcelが必要、Excel本体を使うのだから。

もちろん、Excel抜きに自分でファイルの中身を読み取っていくことも
理論的には可能だし、一太郎やOpenOffice.orgなんかはそうしているはず。

Excel 97-2003ブックは、OLE構造化ストレージにBIFFを詰め込んだもの。
なお、構造化ストレージの読み書きはWindows APIの機能として用意されている、COMだけど。
2007は全く別物で、Office Open XMLをZIP圧縮したもの。やるならあと頑張れ。道なき道を覚悟しろ。
552デフォルトの名無しさん:2007/12/12(水) 23:35:24
構造化ストレージは素直にJava使ってPOI経由で
アクセスしたほうがいいんじゃまいか。スレ違うけど。

ODBC-Excelドライバ経由で叩く手もあるよね。癖があるけど。

OOXMLならまだ触りやすい気もするかな、かな。
553デフォルトの名無しさん:2007/12/13(木) 03:52:08
>>539が新米教師で「そんなもんCじゃなくてエクセル上でやればいいじゃないか」
と勘違いしたのは俺だけでいい。
554デフォルトの名無しさん:2007/12/13(木) 03:58:55
>>486
cygwin
555デフォルトの名無しさん:2007/12/13(木) 12:21:12
>553が何を言わんとしているのか理解できないのは私だけでいい。
556デフォルトの名無しさん:2007/12/13(木) 12:41:21
こんにちは。突然ですが、
C言語でスレッドプログラミングの勉強をするのにいい本ってありませんか?
どなたか知っている方いたら教えてください。
557デフォルトの名無しさん:2007/12/13(木) 13:04:39
google
558デフォルトの名無しさん:2007/12/13(木) 14:00:27
Sleep関数を使ってウェイト処理をしようと思っているんですが、
Sleep();の値にはint型の数値しか取り扱えないのでしょうか?

また、マイクロ秒単位でのウェイト処理をする方法はないでしょうか?
559デフォルトの名無しさん:2007/12/13(木) 14:17:26
そもそもSleepはそんなに精度のよいものじゃない。
だいたい10msが限界

CPUのタイムスタンプカウンタでも使って、
ビジーループすればいいんじゃないかね。
560デフォルトの名無しさん:2007/12/13(木) 15:49:17
すみません。
HTMLから全てのURLを抽出するにはどうすればいいですか?
561デフォルトの名無しさん:2007/12/13(木) 15:59:40
562デフォルトの名無しさん:2007/12/13(木) 15:59:42
tp://から空白や"までを取得すれば良い
563デフォルトの名無しさん:2007/12/13(木) 16:01:38
2秒早かったが
>>562の方が的確でFTPもおkと言ってきたか
フフぬかったわ
564デフォルトの名無しさん:2007/12/13(木) 16:01:46
相対URLはどうすればいいですか?
565デフォルトの名無しさん:2007/12/13(木) 16:03:29
>>561-562
httpsとかもありますよね?
566デフォルトの名無しさん:2007/12/13(木) 16:04:06
string str; に全文入っているとする
こんな感じだろう

while(1){
m = str.find("://");
n = min( str.find(" ") , str.find("\"") );
printf("http%s\n",str.substr(m,n-m));
str=str.substr(m+1);
}
567デフォルトの名無しさん:2007/12/13(木) 16:05:11
相対URLは何処においてあるかで変わるから、元のURLが判らないと無理
568デフォルトの名無しさん:2007/12/13(木) 16:05:50
>>566
たとえば、mailto:には//ありませんよね
569デフォルトの名無しさん:2007/12/13(木) 16:12:29
判定ルーチンをひとつひとつ追加していけばよい 簡単にはできない
イメージタグとか、リンクタグとか、Java スクリプトとか、PHPとか色々あるから全て抽出するには全部の判定を入れる
あと曖昧な記述にも対応しなければ行けない
570デフォルトの名無しさん:2007/12/13(木) 16:13:54
というふうに結構面倒な処理なので、文字列検索でサボろうとしないで
マトモなHTMLパーザを使いましょう。
571デフォルトの名無しさん:2007/12/13(木) 16:17:17
簡易ルーチンを作ろうとすれば、ドットの後に英数字が1文字から4文字あればファイル名か、URLの可能性が高い
あとURLを別の文字で置換している場合はプログラムの構造を把握しなければならず困難
572デフォルトの名無しさん:2007/12/13(木) 16:27:23
irvineにリンク抽出がある あとオープンソースになっている これを流用すればよい
573デフォルトの名無しさん:2007/12/13(木) 16:31:10
ただしirvineは完全ではない java scriptのタグなどは出来ない
574デフォルトの名無しさん:2007/12/13(木) 17:45:21
C++のコード貼ったりしてるけど、このスレが何かお忘れじゃありませんか?
575デフォルトの名無しさん:2007/12/13(木) 21:47:29
URL抽出の参考になりそうなサイトがあれば、紹介してほしいのですが、
よろしいでしょうか?
576デフォルトの名無しさん:2007/12/13(木) 21:59:22
とりあえずおいらは、TLDの一覧リストを作っておいて、
.[TLDs](/|\s)を探して、前後の文字連中がURIとして
延長可能そうならのばす、って言う感じで処理したことはある。
IDNがマイナーだった時代の話。
577デフォルトの名無しさん:2007/12/13(木) 22:21:40
東京ランドディズニーの一覧?
578デフォルトの名無しさん:2007/12/13(木) 22:58:37
入力が大きいときの計算時間を予想したいんですが、

計算時間と入力nの関係をグラフにする場合軸は対数ですか?
579デフォルトの名無しさん:2007/12/13(木) 23:01:10
それはこのスレで聞くことじゃない
580デフォルトの名無しさん:2007/12/13(木) 23:07:45
どこがいいですか?
581デフォルトの名無しさん:2007/12/13(木) 23:29:27
すみません。SDKのGDI+に関する質問です。
グローバルのImageクラスを宣言したいのですが、
理由として、おそらくWM_PAINT内で何度もロードを行うことが
処理に負担をかけてしまうと思ったからです。
//行頭
Image myImg(_T("kuso01.jpg\0\0"));
//ここで宣言するとgdiplusbitmap.h内の
   lastResult = DllExports::GdipLoadImageFromFile(…
   でフリーズします。
WinMain(){
GdiplusStartup(&gdiToken, &gdiSI, NULL);
setlocale(LC_ALL, "");
     //↓以下プロシージャ内で宣言すると正常に動作する
・・・
Image myImg(_T("kuso01.jpg\0\0"));
}
externだとポインタの指定がおかしいのかエラー吐かれたので、
UNICODEが悪いのか、何が原因なのか教えて下さい。
頼みます。
582デフォルトの名無しさん:2007/12/13(木) 23:46:29
>>581
ここはC言語のスレだ。
C言語では「クラス」なぞ宣言出来ない。
他所池他所

つか自分で答え書いてんじゃん。
>Image myImg(_T("kuso01.jpg\0\0"));
で実行されるコードの中に
> lastResult = DllExports::GdipLoadImageFromFile(…
を呼ぶコードがあって、その時点では
>GdiplusStartup(&gdiToken, &gdiSI, NULL);
が実行されてないからだろ。
583デフォルトの名無しさん:2007/12/13(木) 23:54:58
>>582
スマソ
584デフォルトの名無しさん:2007/12/14(金) 00:21:55
>>580
基本情報技術者試験関連スレ
585デフォルトの名無しさん:2007/12/14(金) 09:19:35
キーボードの入力待ちってどういう命令があるんでしょうか?
エンター押さなくて良いやつ教えて下さい
586デフォルトの名無しさん:2007/12/14(金) 09:48:43
kbhit()とか?
587デフォルトの名無しさん:2007/12/14(金) 10:03:31
サンクス
588デフォルトの名無しさん:2007/12/14(金) 10:28:51
コンパイルについて質問があります。
ccやgcchのオプションで、-Oや-xOを用いて
最適化レベルを指定するとき、4や5といった高レベルにすると
計算結果が変わったり意図しない動作をすることがあると聞いたのですが、
具体的にはどういった処理で差異がでるのでしょうか?

通常はO2以上っは使わない方がいのでしょうか?
589デフォルトの名無しさん:2007/12/14(金) 10:39:49
インライン展開とかCPUの計算順序とかだろう
590デフォルトの名無しさん:2007/12/14(金) 10:40:20
>>588
私の知る限り、最適化で値が変わるのは実数演算のみだから余り気にする必要はない。
何故なら、実数演算の場合は完全に値が一致することを前提にプログラムを組む方が稀だから。

ついでに言えば、一致させる必要がある場合はコンパイラとターゲットCPUごとにオプションを微調整する必要があると思った方がいい。
591デフォルトの名無しさん:2007/12/14(金) 11:12:57
スレ違いかもしれませんが

C言語の参考書は何を使いましたか??

またオススメの書籍はなんですか??
592デフォルトの名無しさん:2007/12/14(金) 11:21:17
>>591
スレ違いです。
ちなみに私は、所謂K&Rは読みましたが、参考書としては使っていません。
その他の本も同様です。
593デフォルトの名無しさん:2007/12/14(金) 11:21:42
char*の文字列のポインタ配列を扱う場合の質問です。
char*型の戻り値を持つユーザー定義関数がうまく動作させられません。

char* function(引数){
char* str;
〜処理〜
return str;
}


内部でstrに入れる文字数が長いとダメとか、
printf("%s",function()); では表示されないのに
(c++になってしまいますが)cout<<function()<<'\n';では表示されたりとか、その逆だったりとか、

一見呼び出し側で問題無いように見えても、
1回呼び出すだけなら大丈夫でも、for文などで回してやるとエラーが出て停止したりとか。

char*型というのはそもそも、「char mojiretsu[100]」のように長さを指定する文字列と比べて、
必要な領域を確保される、長さに上限は無い、そういう型だと認識していましたが、間違っていますか?(ある程度以上の長さ入れるとマズイとか)

function内部のstrを、「str[20]」のように固定長の配列にするとうまく動いたりもしますが、
str[20]をstr[10]にすると文字化けしたり、はたまたstr[100]にすると表示されなかったりと、
(戻り値として返そうとしているのは半角4〜8文字程度で、10でも箱が足りないことは無いはずなのに)

いずれもコンパイルは通るので、メモリ周りでなにかマズイ処理になってるのだと思いますが・・・
コンパイラはBorland Bcc5.5フリー版です。
もう3日ぐらい悩んでます お願いします・・・
594デフォルトの名無しさん:2007/12/14(金) 11:28:52
>>593
char* str だけだと入れる場所は無いからダメ。
char str[10] だと、関数抜けると無効だからダメ。

malloc等で動的に確保するか、動作確認したいだけなら static にするとか。
595デフォルトの名無しさん:2007/12/14(金) 11:41:38
>>593
>必要な領域を確保される、長さに上限は無い
もう理解していることだったらすまないが、勝手に確保なぞされない
Cならmalloc、C++ならnewで確保せねばならない

それで今回のケースだが、たとえばchar str[10]みたいにすると、
ローカル変数のスコープは関数内だから関数から抜けた時点でどうなるか分からない

char *strみたいなとこにmallocもせず直接ぶっこんだなら、上に書いたようにNG
mallocせねばならない
596デフォルトの名無しさん:2007/12/14(金) 11:51:40
ありがとうございます!
>>594
>char str[10] だと、関数抜けると無効だからダメ。
やはりそうですか・・・
そのように宣言してから、
return str; で終了すると、コンパイル時に「問題のあるポインタ変換」といった警告メッセージが出ます。
コンパイルは成功するのですが、main関数側で呼び出すと、不安定になります。(表示されたりされなかったり、文字化けしたり、複数回実行するとエラー出て停止したりと。)
回避策として、return &str[0]; とやると警告メッセは出なくなりますが、不安定なのはいっしょです。

>>595
>勝手に確保なぞされない
ありがとうございます!私が間違って覚えていたようです。

今回使っているstrの宣言を「char* str=(char *)malloc(100);」にして、
さっそく試してみたら、問題なく動作しました。

しかし、今回のようにreturnで返すために格納する変数の場合、
free(str);でメモリ開放することができないのでは?
(return文で使うため、その後に処理を書けない。)
動いてはいるものの、メモリ開放せずに関数を終了してしまうのは問題あるような気がします。
何か方法はありますか?
597デフォルトの名無しさん:2007/12/14(金) 11:53:52
>>596
その場合、呼んだ関数側で解放すればいい。
598デフォルトの名無しさん:2007/12/14(金) 12:30:23
>>597
void main(){
printf("%s\n",function());
}

のように呼び出す場合、どうやって開放すれば良いですか?
599デフォルトの名無しさん:2007/12/14(金) 12:32:04
文字列うんぬん以前に、まずポインタを理解すべきだな。
"char*"を文字列型(JavaのString)みたいに考えてるようだが、それは正確ではない。
char(8bit整数)型のポインタが"char*"なだけで、Cではたまたまそこに文字列を入れる
慣例になってる(コンパイラもそう判断している)ってだけ。
それ以外の扱いはint*やdouble*と変わらん。
600デフォルトの名無しさん:2007/12/14(金) 12:32:18
void main(){
char* p = function();
printf("%s\n", p);
free(p);
}

こうなるべ。
まあ static char str[10];
でも動くけどな。
601デフォルトの名無しさん:2007/12/14(金) 12:33:07
>>598
char *temp = function();
if (temp != NULL){
 printf("%s\n", temp);
 free(temp);
}
602デフォルトの名無しさん:2007/12/14(金) 12:41:27
>>599
やっと違和感が解消しました。
どうやら、私に教えてくれた先輩が間違っていたようで・・・
「char*型は、文字数固定なし、制限なく使える文字列変数だ」のように教わって覚えていたもので。
たしかにint*やdouble*でmalloc - freeしてるのと比べて扱いが特殊なのには疑問というか違和感を感じていました。

>>600-601
なるほど。
まずメイン側でもポインタ変数を一時的に用意して、そこに格納し、あとでそれを開放するという形を取れば良いということですね。

>まあ static char str[10];でも動くけどな。
このようにした場合、あとで開放しなくても大丈夫なのですか?
603デフォルトの名無しさん:2007/12/14(金) 12:46:50
>このようにした場合、あとで開放しなくても大丈夫なのですか?
開放する必要は無い。プログラムの最初から最後まで残ってるけどな。
604デフォルトの名無しさん:2007/12/14(金) 13:10:46
>>603
ということは、何百回もループさせて呼び出すような関数の場合、
あまり良い使い方ではないということですか?
605デフォルトの名無しさん:2007/12/14(金) 13:15:29
総合計1M前後なら無視して良いだろ
メモリ食いすぎたら調べればよい
606デフォルトの名無しさん:2007/12/14(金) 13:51:27
>>604
staticな変数は、その関数を何回呼ぼうと同じ場所の同じものが使われる。
607デフォルトの名無しさん:2007/12/14(金) 13:57:43
1から100までの数をランダムに100回発生させ、その発生した数の(1回毎の)平均値を
示すプログラムを教えてほしいです。
さらに、そのコンパイル結果をコピーできるようなプログラムを教えてほしいです。



608デフォルトの名無しさん:2007/12/14(金) 14:02:53
宿題スレ行け
609デフォルトの名無しさん:2007/12/14(金) 14:10:18
>>608
はい
610デフォルトの名無しさん:2007/12/14(金) 14:23:56
システムタイムで質問があります。
TimeGetTime()で取得するシステムタイム時間にて
約49日で0クリアされますが、その際にバグがあり、修正を行ったのですが、
すぐに検証する事が出来ません。
システムタイムを任意の値にセットする事は可能でしょうか?
611デフォルトの名無しさん:2007/12/14(金) 14:27:33
ラッパーかまして、スタブでテストしろ
612デフォルトの名無しさん:2007/12/14(金) 14:37:23
>>606
ありがとうございます!
これで心置きなく使えます
613デフォルトの名無しさん:2007/12/14(金) 14:41:42
ありがとうございました。
システムタイムの変更は出来ないという事でおkでしょうか?
ラッパー使ったことないので、調べてみたのですが、
支援ソフトつかわないとダメってことでしょうか?
614デフォルトの名無しさん:2007/12/14(金) 14:58:47
>>613
できないという確信はない。できるかもしれん。
ラッパーというのは、DWORD myTimeGetTime() { return timeGetTime(); } みたいな
関数を作れってこと。
615デフォルトの名無しさん:2007/12/14(金) 15:23:16
>614 
 ご親切にありがとうございました。
616デフォルトの名無しさん:2007/12/14(金) 17:00:02
#include <stdio.h>
int main(void){
int r,ki,tree;    int cell[100][100]={0};
int i,j;        int a=0;
 char iff;

scanf("%d",&r);     scanf("%d",&tree);
for(j=0;j<4*r;j++){
cell[j][r-2]=1;
}
cell[tree][r-1]=2;
cell[tree][r]=3;

for(j=0;j<4*r;j++){
for(i=0;i<4*r;i++){
printf("%d",cell[j][i]);
}
printf("\n");
}

while(1){
printf("増やしますか?\ny or n : ");
/***********************************************/
scanf("%s",&iff);
if(iff=='y'){
a++;
cell[tree-a*2][r+a*2]=4;
     :
     :
/**********/以下の部分で、treeが0になってしまうのですが、なぜかわかりません。
617デフォルトの名無しさん:2007/12/14(金) 17:08:54
>>616
cell の添字がマイナスになったらtree壊すべ
618デフォルトの名無しさん:2007/12/14(金) 20:07:24
>>617
レスありがとうございます。
じゃあ配列でこういう書き方は出来ないってこと?
619デフォルトの名無しさん:2007/12/14(金) 20:40:47
>>618

そうじゃなくて、マイナスにならないよう、値をちゃんとチェックしろ、ということ。
620デフォルトの名無しさん:2007/12/14(金) 20:56:00
わかった。
どうもありがとう
621デフォルトの名無しさん:2007/12/14(金) 22:44:35
int main(int argc, char *argv[]){
int i, len, k = 0;
char *cp,*dp;
char buff[BUFFSZ],*array[BUFFSZ];
for(i = 0 ; i < BUFFSZ ; i++){
array[i] = NULL;
}
printf("文字列を入力してください。\n");
printf("\",\"(カンマ) で区切り配列に格納し、ファイルに出力します。\n\n");
scanf("%s",buff);

for(cp = buff ; *cp != '\0' ; cp++){

数値を入力すると強制終了してしまう・・・。
どなたか教えてください・・・。
622デフォルトの名無しさん:2007/12/14(金) 22:50:16
>>621
> array[i] = NULL; 

これは array[i] = 0; だな。
NULLは間違い。

さらに言えば、バッファのクリアもいらない。
自称上級者でも、バッファのクリアしろって言うやついるけど、だまされるな。
623デフォルトの名無しさん:2007/12/14(金) 22:57:12
>>622

わかりづらい書き方だけど、
arrayはポインタの配列だからNULLであってるだろ。

scanfって最後に'\0'入れたっけ?
624デフォルトの名無しさん:2007/12/14(金) 22:58:37
>>623
ほんとうだ。
ポインタの配列だった。
625デフォルトの名無しさん:2007/12/14(金) 22:59:33
2ちゃんねるって有料なの?
はい。有料です。
2ちゃんねる使用料
■閲覧
1スレッド 25円
■書きこみ
1レス 10
スレ立て 500円(大人の時間、ニュース速報は1000円)
混雑時は立てる事が出来ない場合がありますが、その時は課金されません
■書きこみ放題
・プラチナプラン 4800円 閲覧無料 スレ立て200円、通常3スレ/月、実況5スレ/週の無料サービス
・ゴールドプラン 3500円 閲覧無料 スレ立て半額 HOT!
払わないと、大変なことになるかもしれませんね・・・( ̄ー ̄)ニヤリ
2ちゃんねるは有料だった
ソース
http://www.geocities.jp/guide_2ch/
626デフォルトの名無しさん:2007/12/14(金) 23:02:21
>>623
自動的に\0はつけられるよ。
バッファあふれたら別だけど
627デフォルトの名無しさん:2007/12/14(金) 23:05:20
>>621 は、掲載してるソース以外の場所に原因がありそう。
628デフォルトの名無しさん:2007/12/15(土) 00:05:58
>>621
エスパーすると、
>char buff[BUFFSZ],*array[BUFFSZ];
char buff[BUFFSZ],array[BUFFSZ][BUFFSZ];
こうすると動く気がする。
629デフォルトの名無しさん:2007/12/15(土) 00:57:14
>>621
arrayに渡すエリアの確保を忘れているとかか?
arrayはポインタの配列だからarrayに色々データを入れるのなら
何処かでmallocでエリアを作らんとだめじゃね?
630デフォルトの名無しさん:2007/12/15(土) 01:20:41
強化学習ってC言語だとプログラミングむずい?
631デフォルトの名無しさん:2007/12/15(土) 01:28:39
理論自体が分かってるなら難しくないよ
632デフォルトの名無しさん:2007/12/15(土) 03:05:47
VC++でOpenCV使ってんだけど、
OpenCVのライブラリいじってタイトルバー消すにはどうしたらいい?
そもそもライブラリ見ても、タイトルバーの消し方がわからん。
何かいい方法知りませんか。
633デフォルトの名無しさん:2007/12/15(土) 11:32:49
ポインタ氏ね
634デフォルトの名無しさん:2007/12/15(土) 12:05:27
>>631
強化学習が分かれば
囲碁のプログラミングも出来るかな?
635デフォルトの名無しさん:2007/12/15(土) 12:22:59
>>632

OpenCVの機能じゃなくて、Win32APIの話になる。
すれ違いなので↓こっちへ
http://pc11.2ch.net/test/read.cgi/tech/1196874830/
636デフォルトの名無しさん:2007/12/15(土) 12:26:12
囲碁プログラムに強化学習を使うことも出来るよ
637デフォルトの名無しさん:2007/12/15(土) 12:35:47
>>636
基本はヒューリスティックの自動構築ですか?
冬休みに10級くらいで打てるソフトを作りたい。
638デフォルトの名無しさん:2007/12/15(土) 12:40:08
うん
639デフォルトの名無しさん:2007/12/15(土) 12:52:44
ちなみにおれはアマ5段ほどの棋力があります。
囲碁のソフトを作るのには有利ですか?
640デフォルトの名無しさん:2007/12/15(土) 13:06:51
必ずしも有利になるとは言えない
でも不利になることは無いと思うよ
641632:2007/12/15(土) 13:09:46
>>635
ありがとうございます
642デフォルトの名無しさん:2007/12/15(土) 13:16:27
>>640
ゲームプログラミングをしたことありますか?
643デフォルトの名無しさん:2007/12/15(土) 13:27:53
釣れますか? いいえ、それは釣れません
644デフォルトの名無しさん:2007/12/15(土) 13:30:08
いやルールを1から知るよりは、予め知ってたほうが効率よくプログラム書けるから不利にはならないだと思うよ。
ボーリングスコア計算を練習で作ってみてって言われてストライクスペアの計算知らなかったから最初は困った。。。
645デフォルトの名無しさん:2007/12/15(土) 13:33:16
>>642
あるよ
というか専門分野
囲碁じゃないけど
646デフォルトの名無しさん:2007/12/15(土) 14:24:49
>>645
友達になりませんか?
当方、専門を通信にしようかAIにしようか迷っている
電気電子系の学生です。
相談に乗ってもらえるとありがたしでつ。

Skypeのアカウント名は
sunsunlight_heart
でつ。
連絡待ってます。
(といっても今日は5時まで家に帰ってきませんが)
647デフォルトの名無しさん:2007/12/15(土) 14:31:38
こんなスレでまさか「友達になりませんか?」のフレーズを見る日がくるとは思わなかった
648デフォルトの名無しさん:2007/12/15(土) 14:34:38
>>647
同じくw
649デフォルトの名無しさん:2007/12/15(土) 14:46:10
>>621 です。あれこれ試しましたが、どうしても強制終了
してしまいます。たぶん、どっかしらをちょろっと直せば
動くと思うんですが、どなたかわかりませんか?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TXT "fileout.txt"
#define BUFFSZ 128
void fileout(int,char*); /* ファイル出力 */

int main(int argc, char *argv[]){
int i, len, k = 0;
char *cp,*dp;
char buff[BUFFSZ],*array[BUFFSZ];

for(i = 0 ; i < BUFFSZ ; i++){
array[i] = NULL;
}

printf("文字列を入力してください。\n");
printf("\",\"(カンマ) で区切り配列に格納し、ファイルに出力します。\n\n");
scanf("%s",&buff);

650デフォルトの名無しさん:2007/12/15(土) 14:47:13

for(cp = buff ; *cp != '\0' ; cp++){
while(*cp == ' ') cp++; /* 空白を飛ばす */
if(*cp == ',') cp++; /* カンマを飛ばす */
if(*cp == '"'){ /* 引用符の場合 */
dp = ++cp;
for(len = 0 ; *cp != '"' ; cp++){
len++; /* 引用符で囲まれた文字数 */
if(*cp == '\0') break;
}
}else{
dp = cp;
for(len = 0 ; *cp != ',' ; cp++){
if(*cp == ' ' || *cp == '"'){
break;
}
len++; /* カンマ間の文字数 */
}
cp--;

}
651デフォルトの名無しさん:2007/12/15(土) 14:48:27
if(len != 0){
array[k] = malloc(len + 1);
strncpy(array[k], dp, len);
*(array[k] + len) = '\0';
k++;
}
if(k > BUFFSZ) break;
}
fileout(1,0);

for(i = 0 ; array[i] != NULL ; i++){
fileout(2,array[i]);
}
fileout(3,0);
system("PAUSE");
return 0;

}

652デフォルトの名無しさん:2007/12/15(土) 14:51:19
void fileout(int x , char *num){
static FILE *fp;
switch(x){
case 1:
fp = fopen(TXT,"w");
break;

case 2:
fprintf(fp,"%s\n",num);
break;

case 3:
fclose(fp);
break;
}

}

>>649-651 連書すみません。
653デフォルトの名無しさん:2007/12/15(土) 15:09:14
>>650
if(*cp == ' ' || *cp == '"'){

if(*cp == ' ' || *cp == '"' || *cp=='\0'){
654デフォルトの名無しさん:2007/12/15(土) 15:11:25
>>649
×scanf("%s",&buff);
○scanf("%s",buff);
655デフォルトの名無しさん:2007/12/15(土) 15:16:14
>>653-654
ありがとうございます!!正常に稼動しました!!
もっと基礎を勉強する必要があると反省しました・・・。
656デフォルトの名無しさん:2007/12/15(土) 16:25:02
2から10000の素数を求めるプログラム(コメ多くてすみません)
なんですが、コンパイル後起動させようとするとそのまま停止
してしまいます。m=1000にして1000までの素数を求めると起動
します。なぜでしょうか?ただパソコンのスペックが低いせい
かもしれませんが・・・

int main(void)
#define l 10000
{
int m=10000,i,j,q,p[l];

for(i=1;i<m;i++) p[i]=0; /*配列の初期化=フラグを0にしておく.フラグが0の間は素数の可能性がある*/
p[1]=1; /*1は素数じゃないので除外(=配列に格納されてるフラグを1にする)*/

q=2;
for(j=pow(q,2);j<m;j=j+q) p[j]=1; /*p[4]=1,p[6]=1,p[8]=1,....2以外の偶数は素数じゃないので除外*/

/*ここからは奇数の中で素数じゃないのを除外するループ*/
q=3; /*1以外で一番小さい奇数3を最初に代入*/
while(pow(q,2)<=m){
for(j=pow(q,2);j<m;j=j+2*q) p[j]=1;/*p[pow(3,2)=9]=1,p[9+2*3=15]=1,p[15+2*3=21]=1,...と3の倍数で
再び奇数となるものだけを除外していく*/
q += 2; /*2加算することにより、次は5,その次は7の倍数を除外...と順に奇数をたどって除外していく*/

}
/*ココからは最終的にフラグが0だった(=素数と判明した)数を出力する*/

for(i=1;i<m;i++){ /*i=2にしておけばp[1]=1;は書かなくていい*/

if(p[i]==0) printf("%d\n",i);
}
}
657デフォルトの名無しさん:2007/12/15(土) 16:31:36
関係ないけど、せっかくdefineしてるならmもそれを使えよ
658デフォルトの名無しさん:2007/12/15(土) 16:40:30
>>656
環境は?
スタックオーバーフロー起こしてんじゃないのかな。
配列をグローバルにするか、staticつけてごらん。
659デフォルトの名無しさん:2007/12/15(土) 16:44:24
bitset<10000> a;
とかつかえ
0と1しか記録しないのに32bit使うのがおかしい
660デフォルトの名無しさん:2007/12/15(土) 16:46:28
while文で無限ループになってんじゃね?
printf入れて確認したほうがいいよ。
661デフォルトの名無しさん:2007/12/15(土) 16:47:51
なぜそこでSTLを勧める。どうみてもC言語だろ
662デフォルトの名無しさん:2007/12/15(土) 16:48:03
int p[10000]とかだろ
663デフォルトの名無しさん:2007/12/15(土) 16:49:33
ビット単位を扱うのが、C言語だと複雑になる為だ
8倍も使うがやむを得ず初心者はcharでもよい
664デフォルトの名無しさん:2007/12/15(土) 16:50:09
まずスレタイを読め
665デフォルトの名無しさん:2007/12/15(土) 16:58:06
つか、intの10000 くらいの配列じゃスタックオーバーフローにならんだろ。
666デフォルトの名無しさん:2007/12/15(土) 17:00:11
いや、LSI-C(試食版)と予想w
667デフォルトの名無しさん:2007/12/15(土) 17:01:22
なんつうコスパの悪いスレ・・・
668デフォルトの名無しさん:2007/12/15(土) 17:01:38
>>>666
それ使ってます!
もしかしてそれが原因ですか?
669こうやるんだよ:2007/12/15(土) 17:04:11
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define l 10000

int *pp;
int p(int x){ int m=x/32,n=x%32; return (pp[m]>>n)&1; }
void p_on(int x){ int m=x/32,n=x%32; pp[m]|=(1<<n); }

main(){
int m=10000,i,j,q;
pp = (int*)calloc(l/32+1,4);

p_on(1);
q=2; for(j=pow(q,2);j<m;j=j+q) p_on(j);

q=3;
while(pow(q,2)<=m){
for(j=pow(q,2);j<m;j=j+2*q)p_on(j);
q += 2;}

for(i=1;i<m;i++)if(p(i)==0) printf("%d\n",i); }}
670こうやるんだよ:2007/12/15(土) 17:05:16
>>668
まずは、BCC developerいれておけ
LSIは駄目すぎ
671デフォルトの名無しさん:2007/12/15(土) 17:07:26
>>667
http://www.cospa.com/
これのことか
672デフォルトの名無しさん:2007/12/15(土) 17:24:25
>>656
↓じゃあかんの?

int isprime(unsigned int x)
{
unsigned int i;
if (x < 4) return 0;
if (x % 2 == 0) return 1;
if (x % 3 == 0) return 1;
for (i = 3; i < x; i++)
{
if (x % i == 0) return 1;
}
return 0;
}
673デフォルトの名無しさん:2007/12/15(土) 17:25:40
未だにLSI C-86なんて化石コンパイラ使ってる奴いるんだ…
674デフォルトの名無しさん:2007/12/15(土) 17:26:19
金だかやる気のない学校では使ってそうだな
675デフォルトの名無しさん:2007/12/15(土) 17:29:01
金なくても gcc でいいだろ・・・。
676デフォルトの名無しさん:2007/12/15(土) 17:34:25
vc++やbccで動く物がminGWで動かないのが時々あるのでgccは駄目だな
お手軽でよく動くのはbccだ
677デフォルトの名無しさん:2007/12/15(土) 17:37:53
>>647
お願いです。
いろいろ話を聞かせて欲しいです。
678デフォルトの名無しさん:2007/12/15(土) 18:01:35
とりあえず10までの素数は自力で出して
それ以降は
1の位が1379の時だけ調べれば
10000回のループから
1000回のループに減らせるんじゃないか?
1回のループで4回調べる事になるけど
679デフォルトの名無しさん:2007/12/15(土) 19:01:16
調べること自体のループのこと考えてないだろ
680デフォルトの名無しさん:2007/12/15(土) 19:04:42
int vecsize_math(char *fname){

printf("%s\n",fname);
if((fp=fopen(fname,"r"))==NULL){
printf("can't open math001.c: %s\n",fname);
exit(1);
}
}

という関数があった(これは抜粋)として、
printf文でdata001.txtを表示できてて、かつ、emacsでそのファイル(data001.txt)の中身を表示できるのに
can't openmath001.c data001.txtって表示されるんですけど
なんででしょうか?
引数のfnameにはdata[k].fname1という構造体配列の文字列から送ってます。
681デフォルトの名無しさん:2007/12/15(土) 19:07:31
:が消えてるのは不思議だね
682デフォルトの名無しさん:2007/12/15(土) 19:08:54
それは書き忘れです。
683デフォルトの名無しさん:2007/12/15(土) 19:11:29
なんで抜粋したところが間違ってるってわかるの?
684デフォルトの名無しさん:2007/12/15(土) 19:14:50
>>680
パスが違うとか
685デフォルトの名無しさん:2007/12/15(土) 19:18:35
>>676
それはその動かないプログラムに問題があるとしか・・・
686デフォルトの名無しさん:2007/12/15(土) 19:19:25
それは最初からファイル名を表示してるからじゃ
687デフォルトの名無しさん:2007/12/15(土) 19:21:11
data001.txt がカレントディレクトリ内にないに1票。
688デフォルトの名無しさん:2007/12/15(土) 19:21:44
たくさんのプログラムファイルのうちのひとつなので、
みじかくして考えてみます。
689デフォルトの名無しさん:2007/12/15(土) 19:23:24
"w" で何かファイルを作って、そのファイルが本当に
data001.txt のあるディレクトリ内に作られるかどうか確かめたら?
690デフォルトの名無しさん:2007/12/15(土) 19:27:43
フルパスで指定しろ
691デフォルトの名無しさん:2007/12/15(土) 19:49:49
そこの関数の後を全部コメント文にして
実行したらまわるけど、コメント文じゃなくしたら
同じことに。文字列の領域オーバーかともおもったけど
その関数まで全く同じにしているのde
692デフォルトの名無しさん:2007/12/15(土) 19:54:29
723 :どうですか解説の名無しさん:2007/12/15(土) 19:38:42.08 ID:4BOgj0mN
ドラワル ゲストチアドラ
pass:dragons
http://kissho4.xii.jp/50/src/5yoshi3437.zip.html

693デフォルトの名無しさん:2007/12/15(土) 19:56:07
ソースかと思ったら誤爆かよ
694デフォルトの名無しさん:2007/12/15(土) 20:02:33
ドラゴンズNO.1ジョッキー ゲスト福留
pass:dragons
http://www.uploda.net/cgi/uploader1/index.php?dlpas_id=0000276270.zip

695デフォルトの名無しさん:2007/12/15(土) 20:25:49
>>646
Skypeじゃなくてどこか適当なスレで相談に乗るよ
ちなみに>>647は別人
696デフォルトの名無しさん:2007/12/15(土) 20:26:55
>>695
ガチで悩んでいます。
お願いです。Skypeで連絡をください。
sunsunlight_heart
697デフォルトの名無しさん:2007/12/15(土) 20:29:48
>>696
セックルしようよ
698デフォルトの名無しさん:2007/12/15(土) 20:33:11
まずは写真をうpしろ。
話はそれからだ。
699デフォルトの名無しさん:2007/12/15(土) 20:39:37
順序が根本的に間違っている気がするのは漏れだけか?
自分の都合だけで他人が気安く友達になってくれるものなのか?
700デフォルトの名無しさん:2007/12/15(土) 20:41:43
まずはおっぱいうp
701デフォルトの名無しさん:2007/12/15(土) 20:42:13
「プログラムは上から実行される」と言いますが、正確に言うと、
上から実行されるようなコンパイラの仕様にした、ってことでしょうか?
702デフォルトの名無しさん:2007/12/15(土) 20:43:57
どうでもいい
703デフォルトの名無しさん:2007/12/15(土) 20:46:34
顔を右に90度傾ければ左から実行されるではないか
704デフォルトの名無しさん:2007/12/15(土) 21:34:33
>>695
おれはRubyが書けます。
でもRubyは実用的なソフトの範囲ではとても有用だけど、
アルゴリズムとかを駆使する速度重視のプログラミングでは役に立たないと思います

囲碁のソフトを作るにはやはりC++ですか?それともJavaですか?
オブジェクト指向じゃないと嫌です。
705デフォルトの名無しさん:2007/12/15(土) 21:39:09
C++
706デフォルトの名無しさん:2007/12/15(土) 21:40:17
>>701
縦書きのエディタがあれば右から実行されるのではないかな。
707デフォルトの名無しさん:2007/12/15(土) 21:40:51
>>704
ここはCのスレなので他所でやってください。
708デフォルトの名無しさん:2007/12/15(土) 21:45:05
Cが選択肢に有るならまだ理解できなくも無いが
なぜここに来たんだろう
709デフォルトの名無しさん:2007/12/15(土) 21:57:57
main()内の
int argc, char *argv[]
の意味がわかりません。ググッてみましたが
わかりつくした人の解説のようで、オレの
ハートには届きません。
どなたかオレにわかるようにできる限り簡単に
説明してもらえませんでしょうか?voidとの
違いとか・・・。
710デフォルトの名無しさん:2007/12/15(土) 22:01:12
voidがまずなにかをググるんだ
711デフォルトの名無しさん:2007/12/15(土) 22:02:15
int argc → コマンドライン引数の数(実行ファイル名含む)
char *argv[] → コマンドライン引数を区切った文字列配列(実行ファイル名含む)

例:
hoge.exe /piyo -uma

argc == 3
argv == {"hoge.exe", "/piyo", "-uma"}
712デフォルトの名無しさん:2007/12/15(土) 22:14:00
>>709
お前のハートに届けてやるぜ!

俺の歌を聞けー!!!
レッツゴー!突ーき抜けようぜ
夢で見た夜明けへ〜
まだまだとおいけっどー
713デフォルトの名無しさん:2007/12/15(土) 22:17:05
C++って手続き言語なのかオブジェクト指向型言語なのかどっち?
Ruby厨のおれとしてはとても不思議
714デフォルトの名無しさん:2007/12/15(土) 22:19:14
スレ違い
手続き型言語⊃オブジェクト指向言語
715デフォルトの名無しさん:2007/12/15(土) 22:26:28
>>713
マルチパラダイムって言葉を知らないか。
716デフォルトの名無しさん:2007/12/15(土) 22:32:58
C++って
object.method
って記法出来るっけ?
717デフォルトの名無しさん:2007/12/15(土) 22:37:01
【初心者歓迎】C/C++室 Ver.45【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1197090562/
718デフォルトの名無しさん:2007/12/16(日) 00:13:44
>>711

Dev-C++だと問題なくコンパイルできても
ボーランドでコンパするとint argc が使われていないと
エラーがでます。voidにすると正常に。
要するにDos面で分割コンパするときに

bcc32 ファイル名 ファイル名・・・

ってみたいな操作するときに必要?
719デフォルトの名無しさん:2007/12/16(日) 00:21:25
>>718
合コンでおk

argv を使うなら argc もチェックしたほうがいい
720デフォルトの名無しさん:2007/12/16(日) 00:21:39
エラーとウォーニングの区別つけろよ
721デフォルトの名無しさん:2007/12/16(日) 00:26:10
>>718-720

すいません。エラーでなく、警告でした。
思い通りの動作をしても警告されるのは気分よくないです。
722デフォルトの名無しさん:2007/12/16(日) 00:37:25
警告出さないようにするオプションあるだろ
723デフォルトの名無しさん:2007/12/16(日) 07:22:14
char str[] = "2007-150 12:34:56";
struct tm t_tm;
strptime(str, "%Y-%j %H:%M:%S", &t_tm);
time_t t = mktime(&t_tm);
printf(ctime(&t));

とすると、月日が正しく設定されません。
150というのはthe day of the yearなんですが、
月日を与えることなく%jのみで正しくstruct tmを得るには、
どのようにしたら良いでしょうか。

環境 OS X 10.4 + GCC 4.0.1
724723:2007/12/16(日) 07:52:00
自己解決

struct tm t_tm;
t_tm.tm_year = 2007 - 1900;
t_tm.tm_mon = 0;
t_tm.tm_mday = 150;
t_tm.tm_hour = 12;
t_tm.tm_min = 34;
t_tm.tm_sec = 56;

として、1月の150日目とすることで動きました。
725デフォルトの名無しさん:2007/12/16(日) 08:39:07
#include <locale.h>
#define _XOPEN_SOURCE

int main()
{
char str[] = "2007-150 12:34:56";
struct tm t_tm;
setlocale(LC_TIME, "en_US.iso88591");
char* ret = (char*)strptime( str, "%Y-%j %H:%M:%S", &t_tm);
char buf[256];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &t_tm);
puts(buf);
return 0;
}

2007-05-30 12:34:56

問題なく表示された
ちなみに環境はlinux上のgcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-33)
Cygwin上のgcc(3.4.4.3)でやると構造体に変な書き込みをして、おかしくなるね
tm構造体のtm_mdayが酷いことになってた、tm_monも何故か-2になるし
726デフォルトの名無しさん:2007/12/16(日) 15:36:33
シフト演算子がよく分かりません。

「1ビット左にシフトすると、元の数の2倍の値になる」
らしいのですが、

10進数の10を、2進数にすると、1010
1010を左に1ビット知るとすると、0100
0100をまた10進数に直すと、4

で、全然2倍になってないですよね?どういうことでしょうか?
計算の仕方とか教えてください!お願いします。
727デフォルトの名無しさん:2007/12/16(日) 15:38:11
>>726訂正 (すみません)

×知るとすると
○シフトすると
728デフォルトの名無しさん:2007/12/16(日) 15:52:46
>>726
ビットの数が全然足りない
たとえば、intなら4バイトだから、
00000000 00000000 00000000 00000000
これぐらい必要

00000000 00000000 00000000 00000001 ・・・ 1
00000000 00000000 00000000 00000010 ・・・ 2
00000000 00000000 00000000 00000100 ・・・ 4
00000000 00000000 00000000 00001000 ・・・ 8
00000000 00000000 00000000 00010000 ・・・ 16

4bitしか表現範囲を持たない型って聞いたこと無いけど、
表現範囲を超えるシフトをしたら、>>726がいってるとおりの事象が起こる
これをオーバーフローと
729デフォルトの名無しさん:2007/12/16(日) 15:53:58
1010 = 01010だろう

だからシフトとすると5桁の10100 になってこれは20
730デフォルトの名無しさん:2007/12/16(日) 15:55:58
ビットシフトは、初めが1なら次は2=10、その次は4=100

全てのビットに対して同様のことが起こるから任意の数で2倍になる
731デフォルトの名無しさん:2007/12/16(日) 16:11:46
10進数で、1桁目に0追加して10倍になるのと同じだな
732デフォルトの名無しさん:2007/12/16(日) 16:15:36
16進数で、1桁目に0追加して16倍になるのと同じだな
733デフォルトの名無しさん:2007/12/16(日) 16:22:58
あっああぁーーーーなるほどぉ・・・
>>729の言うとおり5桁にしてシフトしてから10進数にすると、確かに 2倍になってる。

で、
>>728
を見ると 2進数の桁が増えるたびに10進数での値は2倍になってますね。。
頭の0は電卓で打ち込むと消えるので、関係ないと思ってたのですが、
シフトするときの桁数に影響するんですね。
オーバーフローというのは、
10000000 00000000 00000000 00000000
のような数のときにシフトしたら、2倍にならないってことですね。

>>730
ありがとうございます。>>728の図のことですね。
734デフォルトの名無しさん:2007/12/16(日) 16:25:29
>>731-732
なるほど。
で、右シフトすると、10/1、16/1になるわけですね!(10進数で見た時に)
735デフォルトの名無しさん:2007/12/16(日) 16:53:54
すみません。ポインタについて教えてください。

char *str = "abcde";

は、メモリ上のどこかに実際に存在する"abcde"の値のあるアドレスを、
ポインタ型変数、*str に代入しているのだと説明がありました。

では、"abcde" がメモリ上のどこにもなかったらどうなるんでしょう?
このプログラムは常に動くとは限らないんでしょうか?
736デフォルトの名無しさん:2007/12/16(日) 16:58:38
無かったら
コンパイルバグ
737デフォルトの名無しさん:2007/12/16(日) 16:59:57
>>733-734
算術シフトと論理シフトの違いも

2進数でマイナスを表すには2の補数を使う
これは値を反転させて1を加えたもの

0100・・・ 4
↓(反転)
1011
↓(1を加える)
1100・・・ -4

戻し方は、もう一度同じ操作を繰り返す。

本題、-4を右シフトして、1/2にしてみると・・・。(つまり-2)
1100・・・ -4

0011・・・ 3

おかしいことになる。これは論理シフトといって、符号ビットを考慮しないシフトのため。
一番左のビットは符号ビットといって、0ならプラス、1ならマイナスを表す。今度は算術シフトをやってみる。

1100・・・ -4
↓(算術シフト 符号ビットを残しておく)
1110・・・ -2

-2がもとまる。こういう処理ができるのは符号付の型の場合。
unsigned intのような符号なしの場合、マイナスは表現できない。
なぜなら、一番左は符号ビットとして扱われないから。
738デフォルトの名無しさん:2007/12/16(日) 17:10:35
>>736
コンパイルバグというのは、コンパイルしようとしたら、エラーが出るってことでしょうか?
739デフォルトの名無しさん:2007/12/16(日) 17:11:28
>>735
基本的にそれはない。
"abcde"はリテラル文字といって、特殊な領域に確保されるようになっている。
ただ、リテラル文字の領域を破壊することは可能。
そのstrに対して、何らかの文字をstrcpyで上書きしてごらん。
この場合は、処理系によって動作がことなる。
ほとんどの場合、coreになるはず。
740デフォルトの名無しさん:2007/12/16(日) 17:13:09
>>738
コンパイラのバグって意味でしょ
リテラル文字の領域が確保されない、なんてことはない。
741デフォルトの名無しさん:2007/12/16(日) 17:14:42
実行時にメモリ不足かなんかで"abcde"の領域確保に失敗した場合
プログラムの実行はmainに突入する前にストップするだろ。
742デフォルトの名無しさん:2007/12/16(日) 17:22:21
あるかな?
実メモリが不足していようが、
仮想メモリに展開されるから、ロードモジュールをメモリ展開するときに落ちるってことはあまりないと思うけど
あぁ、でもスワップ領域もお腹いっぱいだとありえるのかな
743デフォルトの名無しさん:2007/12/16(日) 17:23:17
>>739-741
ありがとうございます。リテラル文字についてちょっと勉強してみます。
744デフォルトの名無しさん:2007/12/16(日) 17:34:46
>>735
abcdeは文字列リテラルだ。
文字列リテラルは静的領域に確保される。
Windows、組み込み機器等例えどんな環境だとしても
書き換えが不可能な場所に確保される。

メモリ上に文字列リテラルがないとしたら
OSもしくはハードウェア上で障害が発生している。

  "abcde"というデータが壊れている場合、その壊れたデータをchar型として扱う。
      その結果、わけのわからない文字が画面に表示される等の現象が発生

  "abcde"が存在する場所にアクセスできない場合、メモリアクセスエラーが発生。
      暴走、もしくはOSが用意したエラーメッセージを出力
745デフォルトの名無しさん:2007/12/16(日) 17:37:27
WindowsならEXEをロードするときに領域を確保するので
実行段階で領域不足というのはありえない。
メモリ不足ならロード時にエラー終了。実行はされない。
746デフォルトの名無しさん:2007/12/16(日) 17:41:16
いや、WinならファイルマッピングでEXEファイルをマッピングするっしょ
747デフォルトの名無しさん:2007/12/16(日) 17:42:12
>742

仮想メモリがない環境もいっぱいあるんだよ。
748デフォルトの名無しさん:2007/12/16(日) 17:42:32
Cにもインタプリタの実装があってだな
749デフォルトの名無しさん:2007/12/16(日) 18:19:07
画像処理なんですが、任意に指定してその場所だけを出力するプログラミング教えてください
750デフォルトの名無しさん:2007/12/16(日) 18:25:27
日本語でおkと言わざるを得ない
751デフォルトの名無しさん:2007/12/16(日) 18:26:30
フルパスからフォルダまでのパスを得るのかな
752デフォルトの名無しさん:2007/12/16(日) 18:35:51
画像の一部分の矩形領域を指定して保存したいって事なら
OSと処理したい画像のフォーマットくらいは書けや
753デフォルトの名無しさん:2007/12/16(日) 19:48:52
http://www.2-1ch.net/uploader2/upfiles/2.1ch0152.txt
このソースのままプログラムを実行すると
入力した文字が関数inputStr()によってきちんとmain の中のstr[]にコピーされます
しかし17-20行目を削除し、22-46の#if 0 #endif で囲まれた部分を有効にして走らせると
str[]の中身がおかしくなります
どうしたらよいでしょうか?ご享受頂きたいです
754デフォルトの名無しさん:2007/12/16(日) 20:08:57
>>753
menuselectの中、
>fgets(buf,2,stdin);
てやるなら
>char buf[1];
じゃなくてbuf[2]て宣言しろよ
それで隣の領域破壊しているかもしれない
755デフォルトの名無しさん:2007/12/16(日) 20:49:23
#include <stdio.h>
#include <process.h>
#include <math.h>
#include "glibw32.h"
void sen(int,int,int,int);
void swap(int *,int *);

void main(){
FILE *fp;
int mon,kousui,m,mm,tbl[12],max=0;
double pi=3.141592,ag,agplus;
if((fp=fopen("kousui.dat","r"))==NULL)
{
printf("file open error\n");
exit(1);
}
while(fscanf(fp,"%d %d",&mon,&kousui)!=EOF){
tbl[mon-1]=kousui; //該当月の降水量をテーブルに格納
if(tbl[mon-1]>max)max=tbl[mon-1]; //月間降水量の最大降水量をmaxへ
}
756デフォルトの名無しさん:2007/12/16(日) 20:49:53
fclose(fp);
for(m=0;m<12;m++){
tbl[m]=; //各月の降水量を最大月間降水量を100とした値に変換
// printf("%d\n",tbl[m]);
}

ginit(200,200,WHITE); //グラフィックの初期化
ag=-pi/2; //角度の補正(グラフの最初は90度から開始)
agplus=2*pi/12; //1か月分の角度を計算(360÷12をラジアン角で表現)
mm=11; //前月の初期化(1月の前月は12月。テーブルは0から始まるので12月は11に・・・)mm
for(m=0;m<12;m++){ //mは月
sen(); //枠線の描画
sen(); //グラフの描画
ag+=agplus;
mm=m;

}
gend();
757デフォルトの名無しさん:2007/12/16(日) 20:50:42
}
void sen(int sx,int sy,int ex,int ey){
a=(float(ey)-float(sy))/(float(ex)-float(sx));//一次方程式の傾き計算
b=sy-a*sx;//一次方程式の切片計算
for(x=sx;x<=ex;x++){
y=a*x+b;
// printf("%d %d\n",xv,y);
if(FLG==1)
pset(y,x);
else

pset(x,y,BLUE);
}

void swap(int *a,int *b){
int w;
w=*a;
*a=*b;
*b=w;
return;
}
レーダーチャート作ろうとしていますが分からないところがいくつかあります。
分かる方いらっしゃいますか?
758デフォルトの名無しさん:2007/12/16(日) 21:03:40
>>744
>Windows、組み込み機器等例えどんな環境だとしても
>書き換えが不可能な場所に確保される。
大嘘もいいとこだ。
Windowsですらコンパイラによるのに。
759デフォルトの名無しさん:2007/12/16(日) 21:04:29
>>758
例をあげてくれ
760デフォルトの名無しさん:2007/12/16(日) 21:14:03
レスはえーな。

>>759
下のコードはVC2005だとメモリアクセス違反で止まるけど、
BCC5.5だと標準出力に「best」が表示される。

#include <stdio.h>
#include <string.h>
int main()
{
char *p = "test";
p[0] = 'b';
puts(p);
return 0;
}
761デフォルトの名無しさん:2007/12/16(日) 21:33:44
/GFを指定しなけりゃ、VC2005でも動くんでないの。
762デフォルトの名無しさん:2007/12/16(日) 21:38:54
リテラル領域を書き換えたときの挙動は処理系によって違うって最初にいったのに、
人の話聞いてないんだからぁ
763753:2007/12/16(日) 22:19:13
>>754
buf[2]としたらできましたー。ありがとうございます
764デフォルトの名無しさん:2007/12/16(日) 23:40:14
>>757

>レーダーチャート作ろうとしていますが分からないところがいくつかあります。
>分かる方いらっしゃいますか?

そんなのエスパーしかいないよ。
まず、何がわからないか、書くんだ。

765デフォルトの名無しさん:2007/12/17(月) 00:00:18
>>739>>744
文字列リテラルについて調べましたが、やはりよくわかりません。
"abcde" というデータは、プログラマが配列に記憶させてはじめて繋がった
文字としてメモリ上に記憶されるのではないのでしょうか?

「文字列リテラルは静的領域に確保される。書き換えが不可能な場所に確保される。」
というのは、プログラマが、"abcde"という文字列を打ち込んだ時に初めて確保される。
という意味とは違う・・・?
766デフォルトの名無しさん:2007/12/17(月) 00:22:13
>>765
> プログラマが、"abcde"という文字列を打ち込んだ時に初めて確保される。
違う。文字列リテラルとはプログラムがロードされたときに既に確保され、
プログラムが動作しているときには(多分)書き換えられないものだ
(厳密には書き換えても良いが、書き換えた場合、未定義になる)

プログラム上で変更することがある場合は文字列リテラルでは無く
文字列の配列を使うべきだ
また、配列を使う場合は予め最大サイズを確保する必要がある
767デフォルトの名無しさん:2007/12/17(月) 00:28:34
とりあえず765は、PC上でプログラムがどうやって実行されてるのか勉強した方が良い。
768デフォルトの名無しさん:2007/12/17(月) 00:34:32
>>765

>「文字列リテラルは静的領域に確保される。書き換えが不可能な場所に確保される。」

ROM上に確保されるので書き換えらんない、と思っとけ。
組込みだと実際にそういうのもあるし。
769デフォルトの名無しさん:2007/12/17(月) 00:41:00
 いろんな公開されているソースコードを読むと
以下のような実装を多々みかけます。
しかし、俺の上の連中はそれは汚くて危険極まりない
コードだと言います。私にはどんな危険があるのか
不明なので誰か教えてくれませんか?

int func()
{
処理
 if(err)
goto ERR;

ERR;
  ポインタの解放等々
}

もしポインタの解放なんかを一ヶ所でまとめて行うなら
javaやC#のようなExceptionに相当する部分があっても
いいと思うのはやはり馬鹿の考えることなのでしょうか。
770デフォルトの名無しさん:2007/12/17(月) 01:03:56
>>769
それはいい発想だよ
現にGNUあたりのいくつかのプロダクトではそのようなソースを見かける
もしくは、try,catchをgotoを使ってマクロで実現するってのもあり。

Cにはいわゆるtry〜catch〜finalizeが無いから、そういう使い方をするし、
try,catchよりもオーバーヘッドが少ない

じゃあ何でダメなのかっていうと、gotoを乱用すると処理があっちこっちに飛んで、
可読性の悪いコードになるから。
gotoを扱いきれるなら話は別だけど、チームで仕事してたら、必ずしも理想どおりにはいかない。
gotoを変な風に使う人とか、gotoが多いとソースを正しく読解できない人が出てくるかもしれないからね。
771デフォルトの名無しさん:2007/12/17(月) 01:09:25
>>769

goto文有害論を盲信してるだけだから、気にするな。
特に危険が無いから実装も多い。
ただ、波風を立てずに会社に居たいなら従っておいたほうがいいだろうな。
従っておいても無害だし。

>javaやC#のようなExceptionに相当する部分があっても
>いいと思うのはやはり馬鹿の考えることなのでしょうか。

CにExceptionに相当する機能が無いから、
C++、Java、C#に実装されたわけで…
772デフォルトの名無しさん:2007/12/17(月) 07:38:22
>>769
あえて危険な例を挙げるならこんなの

int func()
{
int *p,*q

if((p=malloc(sizeof(int))) == NULL)
goto ERR;
if((q=malloc(sizeof(int))) == NULL)
goto ERR;

//処理
if(err)
goto ERR;

ERR;
free(p);
free(q);
return 0;
}

まあ気をつけてコーディングすれば簡単に防げるけど
773デフォルトの名無しさん:2007/12/17(月) 07:58:02
int func()
{
int *p,*q

if((p=malloc(sizeof(int))) == NULL)
goto PERR;
if((q=malloc(sizeof(int))) == NULL)
goto QERR;

//処理
if(err)
goto ERR;

ERR;
free(q);
QERR;
free(p);
PERR;
return 0;
}
774デフォルトの名無しさん:2007/12/17(月) 08:05:21
>>773

今ひとつ綺麗じゃないが、かといって他にうまいやり方も見つからないんだよな。
こういったエラー処理はいっつも悩む。
775デフォルトの名無しさん:2007/12/17(月) 08:08:43
普通は
int *p = NULL, *q = NULL;
とか
FILE *fp = NULL;
とかにしとくだろ
776デフォルトの名無しさん:2007/12/17(月) 09:59:39
free(NULL) はiok
777デフォルトの名無しさん:2007/12/17(月) 10:11:28
ラベルが複数のgotoは読みにくいな
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
みたいなマクロを使った方がまだましかも
778デフォルトの名無しさん:2007/12/17(月) 11:10:27
いつも↓のように書いてる
インデントが多段になってしまうのが欠点だけど・・・そんなの関係n(略
int func() {
 int *p = malloc(sizeof(int));
 if (p) {
  int *q = malloc(sizeof(int));
  if (q) {
   // 処理
   free(q);
  }
  free(p);
 }
 return 0;
}
779デフォルトの名無しさん:2007/12/17(月) 11:11:18
もう秋田
780デフォルトの名無しさん:2007/12/17(月) 12:42:08
>>777
>>776にあるように、free(NULL)やdelete NULLは何もしないことって決められてたハズ。
なので if (p) のチェックは無くてもOKじゃね?
関数呼び出しが行われなくなる分、極わずかに早くなるかもしれんが…x86みたいに
分岐予測ペナルティがシャレにならん処理系だと、大人しく呼び出した方がいいかも。
781デフォルトの名無しさん:2007/12/17(月) 13:17:31
そういうシリアスな処理中にリソースの開放なんてするなって噂もあるけどな。
782デフォルトの名無しさん:2007/12/17(月) 15:06:33
Linuxでのプログラミングで質問です。

TCP/IPのソケット通信なんですが、
受信専用プロセス(A)と送信専用プロセス(B)を分けます。

Aでソケットを作り、相手から接続があれば、
それをプロセス間通信でBにソケットを渡します。
その方法はどうやったら良いでしょうか?
783デフォルトの名無しさん:2007/12/17(月) 19:12:55
今日からC言語始めた初心者です。
色々検索して解らなかったので質問します。
何かキーを押すと進むみたいな関数って無いんでしょうか?
.exeをクリックしてコマンドプロンプトが開く時に
キーを押すまで窓を開いたままにするのが目的です。
自分と同じ質問してた所ではgetchar();を入れろと書かれてました。
書き方の例等教えてください。お願いします。
784デフォルトの名無しさん:2007/12/17(月) 19:19:10
>782
sendmsg
785デフォルトの名無しさん:2007/12/17(月) 19:55:17
>>783
ふざけんな
やる気ないならやめろ
あるなら参考書なりサイトなりを一通り見ろ
786デフォルトの名無しさん:2007/12/17(月) 20:07:48
>>783
コンソールのプログラムは、普通コマンドプロンプトから実行する。
787デフォルトの名無しさん:2007/12/17(月) 20:15:21
>>783
#include <stdio.h>

int main(){
getchar()
return 0;
}
788デフォルトの名無しさん:2007/12/17(月) 20:20:57
>>783
書き方の例: getchar();
789デフォルトの名無しさん:2007/12/17(月) 20:23:03
>>783
Windows XP や Windows 2000 ならば、スタート→ファイル名を指定して実行、にて"cmd" を入力して OK ボタンをクリックします。
ここで起動するのが、コマンドプロンプト、あるいはコマンドインタープリタと呼ばれるプログラムです。
使用方法については色々調べてみてください。

>>785
わからへんときは、ほんましょうもないこともわからんのや、おまえさんもそんなことあらへんか?
790デフォルトの名無しさん:2007/12/17(月) 20:26:23
あらへんわ
791デフォルトの名無しさん:2007/12/17(月) 20:44:17
そらしやわせやな。
792デフォルトの名無しさん:2007/12/17(月) 20:50:27
いつも不思議に思うんだが、なんでコマンドプロンプトの起動方法を教えるとき、
「ファイル名を指定して実行」から起動する方法を教える人が多いんだろ。
スタート→すべてのプログラム→アクセサリ→コマンドプロンプト
いつもこうやって起動してるんだが、少数派なのかな?
793デフォルトの名無しさん:2007/12/17(月) 20:54:05
単に手順が少なくて済むからってだけでねーの。
794デフォルトの名無しさん:2007/12/17(月) 20:57:23
>>792
面倒くささを自分のレスで体現してるじゃん
795デフォルトの名無しさん:2007/12/17(月) 21:20:07
きあいや。きあいやで
796デフォルトの名無しさん:2007/12/17(月) 21:22:36
普通に「最近使った項目」から起動していますが何か
797デフォルトの名無しさん:2007/12/17(月) 21:26:35
「クィック起動」バーの方が早いよ
798デフォルトの名無しさん:2007/12/17(月) 21:28:58
>>792
ショートカットなかったりすると厄介だから
799デフォルトの名無しさん:2007/12/17(月) 23:30:21
>>780
亀レスだが、某3Dライブラリのサンプルからそのままもってきただけ
複数ラベルよりかは綺麗に書けるかな?ってくらいのノリだからペナルティとか気にしたらイクナイ
800デフォルトの名無しさん:2007/12/18(火) 14:34:20
ポインタとmallocで変数の配列を動的確保して使う場合について。
プログラムの進行に応じて、データはそのままで配列の個数を再設定して使う方法はありますか?

int* nums;
nums=(int*)malloc(10);
上の定義ののち、

nums=(int*)malloc(20);
という処理をすると、元とは別の場所に領域を確保されてしまい、
元のデータは読めなくなってしまいます。

int型に限らず(doubleやcharやその他構造体でも)、プログラムの進行によって何件あるか不確定な、
途中で何件でも増加する可能性のあるデータを確保する変数を扱いたいのです。

課題で作れと言われてるのが、学校の全学生のデータを管理するプログラムで、
学生1名のデータ(氏名、身長、体重、成績などなど)を格納する構造体をつくり、それを全学生数分の配列で扱い、
学生情報の追加・削除の機能を持ち、ファイルからの読み出し/書き込みの機能も持つ・・・というもの。

読み込むファイルによって学生数が10人だったり1000人だったりする可能性がある上に、
「追加」の機能で学生数はいくらでも増やすことが可能。
ファイルを読み込んだ時点で、最初に動的確保して配列を定義、ここまではOKとして。
ファイルからもらった人数+α分の配列を作るようにしたとしても、
もしプログラム上でそれを超える人数が追加されたら、壊れてしまいます。
できれば1件追加するごとに配列を1件ずつ拡大のようにできればいいのですが。

何か手段無いですか?
長文すみません
801デフォルトの名無しさん:2007/12/18(火) 14:35:19
>>800
realloc
802デフォルトの名無しさん:2007/12/18(火) 14:43:57
>>800
>801の書いているようにrealloc()を使うのが素直なケースだが、malloc()とfree()だけでも同じことはできるぞ。
# つーか、realloc()の実態はmalloc()+memcpy()+free()みたいなもんだからな。
803800:2007/12/18(火) 14:51:23
>>801-802
ありがとうございます。
realloc()について調べてみます。
804デフォルトの名無しさん:2007/12/18(火) 14:54:49
reallocによる拡張はブロックコピーが発生しうるから毎回拡張するのは無駄。
数件、あるいは25〜50%くらい一気に広げたほうがいいかもな。

要素数が確定していない場合は構造体+リンクリストを使うのも定跡。
805デフォルトの名無しさん:2007/12/18(火) 15:26:53
realloc()を繰り返すくらいなら、生徒1000人としても4〜8KBのオーバーヘッド
で済むリスト構造を採用する方がスマートだね。
最近のPCじゃrealloc()のコストなんて誤差なんだろうけど。
806デフォルトの名無しさん:2007/12/18(火) 15:35:44
つーか、毎回拡張するコードを実直にブロックコピーで実現する実装なんていまどきあるの?
それと、初心者にCでリスト構造なんて虐め以外の何者でもないぞ。
807超初心者:2007/12/18(火) 17:59:41
凄くレベルの低い質問で申し訳ありませんが助けてください(>_<)
足し算のプログラムを作り、数字以外が入力された時は【エラー】と
出力したいのですがさっぱり分かりません。どうすれば出来るか教えて
貰えると物凄く助かります!!

808デフォルトの名無しさん:2007/12/18(火) 18:03:33
>>807
エラーを表示しない足し算プログラムは作れるのかい?
それは宿題かい?
809デフォルトの名無しさん:2007/12/18(火) 18:06:19
>>807
宿題なら宿題スレへ、そうでないなら判るところまで作りこんだソースを貼れ。
810デフォルトの名無しさん:2007/12/18(火) 18:10:07
なんつーか、1から全部教えてもらって身に付くのか?
作りかけでも出来損ないでもいいから、試行錯誤したソース貼れよ。
811超初心者:2007/12/18(火) 18:23:39
ごめんなさい
なんか違う気がして
ちょっと恥ずかしかったので・・・。

#include <stdio.h>

main () {
int x;
int y;

printf("最初の数字を入力してください > ");
scanf("%d", &x);
printf("足したい数字を入力してください > ");
scanf("%d", &y);
printf("答え %d\n", x + y);

return 0;
}

よろしくお願いします。
812デフォルトの名無しさん:2007/12/18(火) 18:25:45
>>811
方針としては、scanf()では数字以外を入力することができない為「数字以外が入力された」という状況を作れない。
従って、一旦全て文字列として入力してから数字かどうかを判別することになる。
文字列として入力するにはfgets()、数字かどうかを判別にするにはsscanf()かstrtol()が使える。
813デフォルトの名無しさん:2007/12/18(火) 18:28:16
まあscanfの戻り値見てエラー出してバッファクリアしてやりなおせば可能だけどな。
でもまあほかのやり方覚えておいたほうがいいな。
814超初心者:2007/12/18(火) 18:29:30
他のといいますと??
815デフォルトの名無しさん:2007/12/18(火) 18:34:14
他のってのは>>812のレスを踏まえての話だったんだが。
どうせバッファクリアにfgets使うし(fflushでもいいか?)
まずはfgets使ってみては?
816超初心者:2007/12/18(火) 18:36:04
解りました。
頑張ってみます!!
817デフォルトの名無しさん:2007/12/18(火) 18:36:55
fflush()で入力バッファがクリアされることは保証されていない。
818デフォルトの名無しさん:2007/12/18(火) 18:37:39
だから?つけたんだけどな。処理系依存ということで
819デフォルトの名無しさん:2007/12/18(火) 18:42:30
いや、疑問符がついていたから解説した積もりだったんだが。
# 余計なお世話だったかしら?
820デフォルトの名無しさん:2007/12/18(火) 19:01:47
こんなん作ってみた。

#include <ctype.h>

int isnum(char *buffer)
{
int i;
for (i = 0; buffer[i] != '\n' && buffer[i] != '\0'; i++)
{
if (isdigit(buffer[i]) == 0)
{
return 0;
}
}
return 1;
}
821デフォルトの名無しさん:2007/12/18(火) 19:47:54
どうせ数値が必要なんだから、strtol()呼んで帰ってきたポインタのポイント先がナル文字かどうかで判断すりゃいいじゃん。
822デフォルトの名無しさん:2007/12/18(火) 21:37:08
freadで1byte readしたあと、ftellの返却値を見ると数十byteごとに飛ぶんですけど
これってシーケンシャルな値は期待できない?
823デフォルトの名無しさん:2007/12/18(火) 21:40:50
バイナリで開いてないのではとエスパーしてみる。
あるいは,freadの引数が、buffer, 1, 1, fpでは「無い」というオチか?
824デフォルトの名無しさん:2007/12/18(火) 21:53:16
>>823
vc2003使用、freadはその引数だし戻り値=1も確認した上で飛ぶんだよね
825デフォルトの名無しさん:2007/12/18(火) 21:56:18
>>822
テキストストリームに対してftellを呼び出した場合の戻り値は処理系定義
826デフォルトの名無しさん:2007/12/18(火) 22:00:25
fgetpos
827デフォルトの名無しさん:2007/12/18(火) 22:35:56
>>656
普通に実行してちゃんと終わるが、2乗ごときでpow()を使うのは無駄。
もしかしたら、とんでもなく実数演算が遅くて止まって見えるのかも知れず。
828デフォルトの名無しさん:2007/12/18(火) 22:38:54
fgetposも同じでした

試しにfreadだけを繰り返し実行してみると途中で戻り値=0になり
見てみると丁度ftellの戻り値が連番から飛ぶポイントでした
freadの後にftellするとファイルの最後まで読めるのになぁ。。。
829デフォルトの名無しさん:2007/12/18(火) 22:42:35
一体何を言っているのか分からない
830デフォルトの名無しさん:2007/12/18(火) 22:56:06
>806
>つーか、毎回拡張するコードを実直にブロックコピーで実現する実装なんていまどきあるの?
とりあえずぱっと見、FreeBSD の libc、VC8 の CRT、Cygwin の libc あたりはさすがに毎回ブロックコピーにはなってない。
どこまで頑張るかはそれぞれ違いそう。
831デフォルトの名無しさん:2007/12/18(火) 23:06:32
>>829
こんな感じ
do{
read_sz=fread(buf,1,1,fp);
if(read_sz==0)break
pos=ftell(fp);
if(抜ける条件)break
}while(1);

posには1,2,3,4,5,6....という風にシーケンシャルな値を期待してるけど実際には途中で
.....50,51,200,201...という風に返ってきてしまう
doの中でftellを実行しないと、丁度51,200と連番が飛ぶところでread_sz=0となる
ということです
832デフォルトの名無しさん:2007/12/18(火) 23:21:13
\rすっとばしてるんじゃないの
833デフォルトの名無しさん:2007/12/18(火) 23:30:13
しかし、デバッガちゃんと使ってたらそんな書き方にならないと思うのだが、
実行して結果だけで判断してるの?
834デフォルトの名無しさん:2007/12/18(火) 23:50:42
>>832
ありがとうー。そういう制限があるの知りませんでした。
そして、>>823さんのエスパーの意味が今分かりました。ありがとー。

>>833
デバッガは勿論使っていますが、説明なので簡素化しています。
具体的にはどうのような書き方になります?
835デフォルトの名無しさん:2007/12/19(水) 00:19:37
>>834
だから>>825だといってるじゃないか
836デフォルトの名無しさん:2007/12/19(水) 00:30:17
もしWinなら、 fopen の第2引数で"rb"
837デフォルトの名無しさん:2007/12/19(水) 00:48:53
fopenでruby
838デフォルトの名無しさん:2007/12/19(水) 18:40:52
二つの整数値を読み込んで、小さいほうの数以上、大きいほうの数以下の
整数を全て加えた値を表示するプログラムを作りたいのですが↓のように書いたのですが
うまくいきません。どこが悪いか教えていただけないでしょうか。

#include <stdio.h>
int main(void)
{
int a,b,sum=0;

puts("二つの整数を入力してください。");
printf("整数1:"); scanf("%d",&a);
printf("整数2:"); scanf("%d",&b);

if(a>b){
do{
sum=sum+b;
b=b+1;
}while(b>=a);
}
printf("%d以上%d以下の全整数の和は%dです。\n",b,a,sum);

else{
do{
sum=sum+a;
a=a+1;
}while(a>=b);
}
printf("%d以上%d以下の全整数の和は%dです。\n",a,b,sum);

return(0);
}
839デフォルトの名無しさん:2007/12/19(水) 18:45:36
とりあえず,
a>b(かa<b)になるように,aとbを入れ換えたほうが楽
840デフォルトの名無しさん:2007/12/19(水) 18:50:10
>>838
どのように「うまくいかない」のか書いたほうがいいと思うが、
・ a と b にちゃんと値が入っているか printf() などで確認
・計算のループ中に printf() などを入れて経過を確認
すると良いかもね。


841838:2007/12/19(水) 18:52:48
>>839
ありがとうございます その考え方で考えて見ます

>>840
言葉足らずですみません もう一度見直してみます
842デフォルトの名無しさん:2007/12/19(水) 18:53:31
結果表示の場所は間違えただけだと思うが、
 その結果を足し算で使っちゃってるa,bを使ってる
 if文とwhile文の判定が全部逆
の2つだな
843デフォルトの名無しさん:2007/12/19(水) 19:02:01
いろいろ突っ込みどころあるけど、一番の問題はifとelseの間に文挟んじゃってることだな。
844838:2007/12/19(水) 19:08:57
>>842
見直しの参考にさせていただきます ありがとうございます

>>843
助言ありがとうございます エラーが消えてくれました
845838:2007/12/19(水) 19:22:13
皆様のアドバイスを参考に考えてみたらなんとか完成しました
本当にありがとうございました
846デフォルトの名無しさん:2007/12/19(水) 19:24:15
個人的には、「どこが間違っているか」よりは「どうやって間違いを見
付けるか」をアドバイスしたいところてん。

847デフォルトの名無しさん:2007/12/19(水) 20:00:36
長いプログラムを書くときに、
分割コンパイルをつかうと聞いたんだけど、
いくらかファイルにわけて分割コンパイルはしているが
段階的に実行できていない。
段階的に実行することを説明してる本もしくはサイトないですか?
848デフォルトの名無しさん:2007/12/19(水) 20:07:09
>>847
makeファイル

バッチファイルでもかまわないよ
cc -c a.c
cc -c b.c
cc -c c.c
cc -o a.o b.o c.o

ここ参照
http://www-analab.sys.es.osaka-u.ac.jp/~taji/lecture/comp02/comp02-5.pdf
849デフォルトの名無しさん:2007/12/19(水) 20:08:34
構造体の配列をmallocでメモリ確保したいのですが、
そのときの構造体の宣言は

struct kani{
char gazami[20];
char zuwai[20];
char zarigani[20];
};

のままじゃだめなんですか?
850デフォルトの名無しさん:2007/12/19(水) 20:09:34
三角形の2辺の長さb,cとその狭角A(ラジアン)を入力すると残り一辺の長さを余弦定理
で求めて表示するプログラムを作成したいのですがうまくいきません
#include <stdio.h>
#include <math.h>

int main() {
double a , b, c ,A ;



printf( "b = " );
scanf( "%lf" , & b );

printf( "c = " );
scanf( "%lf" , & c );

printf( "cosA = " );
scanf( "%lf" , & A);

a = b*b+c*c-2*b*c*cos(A);
printf( "a = %lf\n" , sqrt(a) );

自分なりに作ってコンパイルも通るのですが、おかしな数字になってしまいます。
間違っているところありましたらご指摘お願いします。
851デフォルトの名無しさん:2007/12/19(水) 20:10:41
はじめのうちは、使っている変数全ての内容を、
・初期化後
・ループ中
・終了前
で出力させれば十分だろう。

でも、デバッグコードは可読性を損なう原因になり、コードが長くなるとバグの原因にもなりうる。
「書かなければバグは入らない」の大原則に従えば、デバッグコードも書かないほうがいい。
本当はデバッガの使い方を覚えるのが一番だな。
852デフォルトの名無しさん:2007/12/19(水) 20:14:52
>>850
角度とラジアンの変換していないんだろ
853デフォルトの名無しさん:2007/12/19(水) 20:24:26
>>849
struct kani{
char* gazami;
char* zuwai;
char* zarigani;
};
ってことかな。
854849:2007/12/19(水) 20:40:14
あれれ?
…その後main文内で参照するときには…わかんないです

struct kani{
char gazami[20];
char zuwai[20];
};

int main(void){
struct  kani  inu;
inu = (struct kani *)malloc(sizeof(struct kani));


こういうものだと思っていたんですが、全然動かなくて
855デフォルトの名無しさん:2007/12/19(水) 20:43:57
struct  kani*  inu;
856デフォルトの名無しさん:2007/12/19(水) 20:44:20
>>854
戻り値はポインタだぞ。
857デフォルトの名無しさん:2007/12/19(水) 20:53:10
>>854
×struct kani inu;
○struct kani *inu;
858デフォルトの名無しさん:2007/12/19(水) 21:40:48
このサイト(ttp://x68000.q-e-d.net/~68user/net/sample/rsa-1.c)
のサンプルをコンパイルしようとしたところ
undefined reference to `ERR_load_crypto_strings'
undefined reference to `RSA_generate_key'
・・・
などと、エラーが出てしまいます。
どうすればコンパイルできるようになるのでしょうか?
859デフォルトの名無しさん:2007/12/19(水) 21:44:44
infがでるときってどういうとき?
860デフォルトの名無しさん:2007/12/19(水) 21:52:18
>>859
あなた自身の内に秘めた、無限の力が解き放たれたとき







マジレスすると、浮動小数点で表すことのできる値の上限を超えたとき。
だったかなw
861847:2007/12/19(水) 21:54:12
段階的にチェックするには
main関数と複数あるうちの1つずつ関数をコンパイルにかけるんですよね?

makefileとかはつかってますよ。
ただし関係ある関数をあつめて1つのファイルにして
複数のオブジェクトを作って実行はやってますけど。
862デフォルトの名無しさん:2007/12/19(水) 22:02:23
>>859
3.0/0.0
863デフォルトの名無しさん:2007/12/19(水) 22:09:06
>>861
> 段階的にチェック
っていう意味が通じてない。
>>848
はがんばって解釈したようだが「そうではない」ってことなのかな?
(cc の -o ってそうだっけ?)

うまく伝えられないのなら、
 1.自分の問題を、これ以上出来ないってほど単純化した環境を作り、
  それを貼り付けるなり、貼り付けるには大きすぎる場合はどこかにアプする。
 2.やりたいことを具体的に書く。
 3.やったことと結果を具体的に書く。
あたりで伝えよ。
864847:2007/12/19(水) 22:22:34
一般的に大きなプログラム作るときに
段階的に実行していくんじゃないの?
865デフォルトの名無しさん:2007/12/19(水) 22:27:37
>>849
これも不思議な日本語だよな。
がんばって解釈すると >>853 になるよね。
 配列をmallocでメモリ確保したい
 →しかもそれは「構造体の配列」ってことだから、意訳して「構造体内の配列」
って感じで。

せめて、「配列を含む構造体をmallocでメモリ確保したい」なら意図が伝わる可能性がある。
質問者が真っ先に知るべきなのは、直面している問題よりもむしろ
 ttp://www.hyuki.com/writing/techask.html
こういこと。
866デフォルトの名無しさん:2007/12/19(水) 22:31:18
>>864
>>848 を修正すると。
cc -c a.c
cc -c b.c
cc -c c.c
cc a.o b.o c.o
こんな感じだ。(実行ファイルは a.out な)
gccならccをgccに置き換えよ。clなら-cを/cに置き換えよ。
せめてコンパイラが何か教えてくれ。
加えて、こういうことではないなら、何がしかヒントをくれ。
867847:2007/12/19(水) 22:35:38
入力ファイルがあるとしてそれを取り入れる関数
検査ファイル1があるとしてそれを取り入れ処理する関数
検査ファイル2があるとしてそれを取り入れ処理する関数
検査ファイル3があるとしてそれを取り入れ処理する関数
出力結果を出す関数

この5つが別々にファイルかかれてるとして
入力ファイルがあっているか、
1つめの検査ファイルの結果があっているか、
2つめ。。。そして最終的な結果があっているか。
っていう風にみていきたいんだけど。どういう風にすればいいのかなって。
868デフォルトの名無しさん:2007/12/19(水) 22:36:45
それ分割コンパイル関係ないだろ
869デフォルトの名無しさん:2007/12/19(水) 22:37:34
分割コンパイルについて何か根本的な勘違いをしてる気がする
870847:2007/12/19(水) 22:46:16
自分がきいてるのは分割コンパイルってどうやってやるんですか

じゃなくて段階的に実行するときにどうやって分割コンパイルを使うのか

ですよ
871デフォルトの名無しさん:2007/12/19(水) 22:49:45
>>867
質問の意味が
 1.足し算をする関数がある
   int MyAdd(int a,int b) { return a+b; }
 2.引き算をする関数がある
   int MySub(int a,int b) { return a-b; }
 3.これら各々の関数が正常に動作することを確認してから結合したい。
ってことならまず
 1-1."1"を確認する。下記のMyAddの引数を変え、それっぽい動作するか確認。
   #include <stdio.h>
   int MyAdd(int a,int b) { return a+b; }
   int main(void){ printf("%d\n",MyAdd(123,456)); return 0; }
 1-2."2"を確認する。下記のMySubの引数を変え、それっぽい動作するか確認。
   #include <stdio.h>
   int MySub(int a,int b) { return a-b; }
   int main(void){ printf("%d\n",MySub(123,456)); return 0; }
 1-3. 結合して確認する
   #include <stdio.h>
   int MyAdd(int a,int b) { return a+b; }
   int MySub(int a,int b) { return a-b; }
   int main(void){ printf("%d\n",MyAdd(123,MySub(456,789))); return 0; }
こういことか?
872847:2007/12/19(水) 22:51:17
そうです
873デフォルトの名無しさん:2007/12/19(水) 22:59:59
>>872
じゃまず。
1."MyAdd.c"を下記の内容で作成。
 int MyAdd(int a,int b) { return a+b; }
2."MySub.c"を下記の内容で作成。
 int MySub(int a,int b) { return a-b; }

1-1-0.MyAddテストソースを作る。"TestAdd.c"を下記内容で作成。
 #include <stdio.h>
 int MyAdd(int,int);
 int main(void) { printf("%d\n",MyAdd(123,456)); return 0; }
1-1-1.分割コンパイルしたい場合は下記。(コンパイラはgccと仮定する)
  gcc -c MyAdd.c
  gcc -c TestAdd.c
  gcc MyAdd.o TestAdd.o
 実行ファイルはa.outもしくはa.exe。
 一気にコンパイルリンクまでやってよければ下記だけでよい(gcc -c 何チャラは不要)。
  gcc MyAdd.c TestAdd.c
1-2-0.MySubテストソースを作る。"TestSub.c"を下記内容で作成。
 以下同文。

これで君の質問は終了でよいか?
874デフォルトの名無しさん:2007/12/19(水) 23:08:35
#include<stdio.h>
int add(int);
int main()
{ int sum;
sum = add(10);
printf("sum = %d\n", sum);
sum = add(20);
printf("sum = %d\n", sum);
sum = add(100);
printf("sum = %d\n", sum);
return 0;
}
int add(int x)
{ static int gokei = 0;
gokei += x;
return gokei; }
私はint gokei = 0;とあるので、読み込むたびにsumは0になって、
sum = 10,sum = 20,sum = 100と表示されると思うのですが、
参考書にはコンパイルして実行した結果sum = 10,sum = 30,sum = 130(改行省略)
と表示されると書いてありました。
staticにした変数は書き換えられなくなるのですか?
それとも、初期化できなくなる、という意味なのでしょうか?
875デフォルトの名無しさん:2007/12/19(水) 23:11:34
>>874
その参考書にはstaticの説明が書いてないのか?
876デフォルトの名無しさん:2007/12/19(水) 23:12:41
ったりめえだろ
877デフォルトの名無しさん:2007/12/19(水) 23:12:46
>>874
関数内で定義したstatic変数は、その関数からしか見えないだけで、そ
れ以外はグローバル変数と同じような挙動。だから、初期化 gokei = 0
というのはプログラム開始時にしか行われない。関数に入る度に gokei
= 0 されるのではない。

878デフォルトの名無しさん:2007/12/19(水) 23:13:50
>>874
int add(int x) { static int gokei = 0; gokei += x; return gokei; }
この場合のstaticは、ほぼ下記に等しい
int gokei = 0; /* グローバル変数 */
int add(int x) { gokei += x; return gokei; }
違いはadd関数以外からでもアクセスできるかどうかの違いだけ。
君がどう思うかどうかは関係ない。
879デフォルトの名無しさん:2007/12/19(水) 23:14:41
は?
880デフォルトの名無しさん:2007/12/19(水) 23:23:11
とりあえず貼り付ける時はタブは無視されるからスペースなりで書き換えてくれ
見づらくて仕方が無い
881デフォルトの名無しさん:2007/12/19(水) 23:24:23
>>879
kwsk
882デフォルトの名無しさん:2007/12/19(水) 23:35:17
>>858

OpenSSLのライブラリを読み込んでないんだろ。
883デフォルトの名無しさん:2007/12/19(水) 23:49:24
>>882
gcc -lssl
とライブラリを指定したらあっさりできました・・
インクルードファイルを指定するだけではダメだったんですね・・orz
ありがとうございました
884デフォルトの名無しさん:2007/12/20(木) 00:05:47
ラウールはカペッロが引き止めたんだろ
馬鹿なことは止めてくれとフロントにいって
885デフォルトの名無しさん:2007/12/20(木) 00:13:56
GK(Porteros)
01 "CASILLAS"     Iker Casillas Fernandez     1981/05/20 185cm/79kg
13 "CODINA"       Jordi Codina Rodriguez     1982/04/27 188cm/79kg
25 "DUDEK"       Jerzy Dudek             1973/03/23 187cm/81kg

DF(Defensas)
02 "M. SALGADO"     Michel Salgado Fernandez     1975/10/22 174cm/75kg
03 "PEPE"             Kleper Laveran Lima Ferreira "Pepe" 1983/02/26 187cm/81kg
04 "SERGIO RAMOS"   Sergio Ramos Garcia        1986/03/30 183cm/73kg
05 "CANNAVARO"     Fabio Cannavaro           1973/09/13 175cm/72kg
12 "MARCELO"         Marcelo Vieira da Silva Junior   1988/05/12 174cm/73kg
15 "DRENTHE"        Royston Drenthe           1987/04/08 172cm/78kg
16 "HEINZE"         Gabriel Ivan Heinze          1978/04/19 178cm/72kg
21 "METZELDER"      Christoph Metzelder          1980/11/05 193cm/84kg
22 "TORRES"          Miguel Torres Gomez         1986/01/28 185cm/75kg
886デフォルトの名無しさん:2007/12/20(木) 01:11:43
Cのリファクタリングみたいな本はないのかな?
887デフォルトの名無しさん:2007/12/20(木) 01:27:18
デザパタならともかくリファクタリングなんて手続き型ベースの言語ならみんな同じようなもんだと思うが。
888デフォルトの名無しさん:2007/12/20(木) 02:32:04
>>886
お前はリファクタリングを全然理解していない

3章、4章、6章の一部、8章の一部、9章は
手続き型の言語でも有効なテクニックだぞ
889デフォルトの名無しさん:2007/12/20(木) 07:19:37
なんかカチンとくるよな。
890デフォルトの名無しさん:2007/12/20(木) 07:42:19
ティンとキター
891デフォルトの名無しさん:2007/12/20(木) 07:53:11
みんなエスパーすぐる。何話してるのかさっぱりわからんw
・環境
・目的
・疑問点
・ソース(一部抜粋でも可)
くらいは最低でも書いて欲しいところ。
892800:2007/12/20(木) 08:04:24
800です。

malloc,free またはreallocで配列を定義しなおすと、いちいち全データコピーが発生するようですな。
やってみましたが、無駄に工程数が増える感じで、しっくりこなかったです。
もっとも、学生数数百人分のデータ程度なら、どのみち処理は一瞬で済んだので、動作スピード的にストレスに感じることはなかったですが。

そこで、>>804-806の人が教えてくれた、「リンクリスト」「リスト構造」とやらを調べてみました。
おおむね、要素数が不確定な配列で、要素をシンプルに増減させるサンプルは作れました。
これって、増減の処理はリンクを書き換えるだけでいいとして、
目的の箱に読み下記したい場合、そこまでアクセスするのにいちいちスタートに設定した領域から、
for文などで必要回数分回して辿らないと探せないような感じですが、この処理は無駄ではないですか?
普通に配列で取り、各要素に読み書きするのと比べて、アクセスピード的にどのぐらいのデメリットになりますか?

前者(malloc-freeまたはrealloc)を使うのと、後者(リスト構造)を使うのとどちらを選択すればいいか悩むところです。
要素の増減: 前者<<後者
要素へのアクセス: 前者>>後者
になりそうな想像ですが、プログラマーのみなさんはどちらを主に使いますか?
893デフォルトの名無しさん:2007/12/20(木) 08:12:37
配列とリスト構造のどっちを使うかはケースバイケースだよ。
894デフォルトの名無しさん:2007/12/20(木) 08:27:04
どっちも使うし、そんなことを人に聞いたりしないわ
895デフォルトの名無しさん:2007/12/20(木) 09:17:10
たとえば、要素を番号で指定するのは配列が便利だが、
途中の要素を削除したり途中に追加したりするには不向きだ。

線形リストは線形探索には向くが、2分探索なんかはできない。
そのかわり、要素の追加/削除が簡単だ。

そんな風に使い分ける。
896デフォルトの名無しさん:2007/12/20(木) 09:45:07
両方とも、弱いところをなくした工夫バージョンもあるしな
897デフォルトの名無しさん:2007/12/20(木) 09:52:59
配列を使う場合最初を多めにしてあまり再定義しなくてすむようにして使うな
898デフォルトの名無しさん:2007/12/20(木) 10:21:04
int *p[10000]; と多めにとって置いて

Gakuseimeibo *x; を10確保したら、初めのアドレスをpに追加する あとはリストにする
すると10万人登録でき、アクセス時間は最大で10個たどるだけ
899デフォルトの名無しさん:2007/12/20(木) 11:46:12
ランダムアクセスが多いようなら malloc/realloc、
要素の増減が頻繁ならリスト
900デフォルトの名無しさん:2007/12/20(木) 12:39:20
>>892
どんなアルゴリズム・データ構造も長所短所がある。
何をしたいか、どんな機能が必要かによって実装を選択するのですよ。
適切な実装を選択するのも、プログラマーの能力です。
901デフォルトの名無しさん:2007/12/20(木) 12:52:07
struct container
{
 item_t *items;
 size_t items_count;
 size_t max_items_count;
 size_t delta;
}

int container_expand(struct *container)
{
 if(container->items_count < container->max_items_count) return 1;
 return container_resize(container, container->max_items_count + container->delta);
}

とかやっとけばOK
リンクリストはデータがメモリ上に散らばってキャッシュミスが多くなる傾向にあるから
Cの用途を考えるとそうむやみに使うもんでもない。
902849:2007/12/20(木) 13:24:04
遅くなったけど解決しました。
どうもありがとう。
903874:2007/12/20(木) 14:43:19
>>875 参考書には、「プログラムが終了するまで値を保持する」と書いてありました
>>877>>878ありがとうございました。
>>880、すみません、次からは気をつけます。
904デフォルトの名無しさん:2007/12/20(木) 14:50:21
C言語といえばプログラム終了時にいちいちfreeするバカいるじゃん?
あれマジやめて欲しいよね。
コードサイズは増えるしなによりfreeする際に
HDDにスワップアウトしていた領域をまたガリガリアクセスするからもう最悪。
gotoどころじゃない害悪ありまくりの糞作法だよ。
905デフォルトの名無しさん:2007/12/20(木) 15:05:26
main(){}ではしなくて良いが、f(x){ } とかではしないと確保されたまま
906デフォルトの名無しさん:2007/12/20(木) 15:17:54
局所的なmalloc()ではfree()が必要。
プログラム終了まで使うmalloc()はfree()が不要。
それだけのことだろ。
907デフォルトの名無しさん:2007/12/20(木) 15:18:05
>プログラム終了時に
908デフォルトの名無しさん:2007/12/20(木) 15:19:05
static 用途ならfreeしてはいけない
909デフォルトの名無しさん:2007/12/20(木) 15:19:54
プログラム終了時のfreeの有無で何か違ってくるの?動作的に。
勝手にfreeしてくれる、程度の認識なんだけども。
910デフォルトの名無しさん:2007/12/20(木) 15:20:51
どうせ風呂はいるんだからウンコしてもケツ拭かなくていいって事だよ。
911デフォルトの名無しさん:2007/12/20(木) 15:22:09
>>904
>HDDにスワップアウトしていた領域をまたガリガリアクセスするからもう最悪。

じゃあこれって明示的にfreeしなくても起こるんじゃないの?
912デフォルトの名無しさん:2007/12/20(木) 15:22:49
プログラムが解放するかOSが開放するかの違い freeがヘボならOSに任せる OSのほうが性能上だろう
913デフォルトの名無しさん:2007/12/20(木) 15:23:59
だよな やっぱトイレットペーパーは節約しないとな
914デフォルトの名無しさん:2007/12/20(木) 15:24:11
たとえば、C言語用のfopenとwinAPIのcreateの違い
915デフォルトの名無しさん:2007/12/20(木) 15:26:11
なるほど、ウォシュレットとシャワーの差か。
916デフォルトの名無しさん:2007/12/20(木) 15:26:44
静的確保も、動的確保も終了時にはOSが解放する 動的だけ自分で解放することも無い
917デフォルトの名無しさん:2007/12/20(木) 15:27:03
(´-`).。oO(freeするのがバカなら、わかってないくせにわめく904は果たして何なのだろう)
918デフォルトの名無しさん:2007/12/20(木) 15:51:47
一番楽なのは、どんどんプロセスを作る。
killしちゃえば綺麗に解放される。
ただし重くなる諸刃の剣
919デフォルトの名無しさん:2007/12/20(木) 16:10:03
opendir()でディレクトリを開く際に、
「Program Files」や、「Documents And Settings」フォルダを指定することってできますか?
ロングファイルネームのディレクトリ名や日本語ディレクトリ名は大丈夫でしたが、
あいだにスペースが入ったフォルダだけは読み込めないようで・・・
920デフォルトの名無しさん:2007/12/20(木) 16:22:29
>>919
opendir()っていうUNIXっぽい関数が出てくるのに、「Program Files」
とかWindowsっぽい名前が出てくるのが怪しげ。ちゃんと環境を書くべし。

921デフォルトの名無しさん:2007/12/20(木) 16:30:06
でもまあUnix系でも空白ファイル名あるし
922デフォルトの名無しさん:2007/12/20(木) 17:27:28
>>919

ダブルクォートでくくればOK。
923デフォルトの名無しさん:2007/12/20(木) 18:32:51
Cプログラムについて質問です。
以下のソースを作っているのですが、構造体のメンバ?のところでエラーがでてしまいます。
どうも構造体のメンバー変数の型が間違っているらしいのですが…改善案を教えていただけますか?
ttp://www.uploda.net/cgi/uploader4/index.php?dlpas_id=0000023780.c
DLパスは1111です
924デフォルトの名無しさん:2007/12/20(木) 19:09:23
>>923
実行時エラーなのかコンパイルエラーなのか、エラーメッセージは何か、くらい書いてくれ。
LISTなのかPARENTなのか、ごっちゃになってるぞ。
925デフォルトの名無しさん:2007/12/20(木) 19:12:53
で、、、LISTのメンバーのparent は struct PARENT * で
PARENT のメンバーのcfirst、clastはstruct LIST *なんじゃないの?
あー、、struct XX は typedef したほうがすっきりするぞ。
あとnextとかprevもへんだろ
926デフォルトの名無しさん:2007/12/20(木) 19:59:29
#include<stdio.h>
int siguma(int a,int d,int n);
int syokou, kousa, retu, sum;
int main()
{
printf("初項を入力してください---");
scanf("%d", &syokou);
printf("交差を入力してください---");
scanf("%d", &kousa);
printf("何列目までの和を求めますか?---");
scanf("%d", &retu);
printf("列目\n");
if (retu >= 0)
sum = siguma(syokou, kousa, retu);
printf("合計は%dです\n", sum);
return 0;
}
int siguma(int a,int d,int n)
{
if (n <= 0)
return 0;
else
return a + (n - 1)d + siguma(n - 1);
}
等差数列のn項までの和を表すプログラムを作ろうとしているのですが、
コンパイルすると、「23行目(elseの下の行)に ; がない」と表示されて
コンパイルできません。何がいけないのでしょうか?ヒントをください。
コンパイラはBCC5.5でBCC developerも使ってます。
927デフォルトの名無しさん:2007/12/20(木) 20:01:02
return a + (n - 1)*d
928デフォルトの名無しさん:2007/12/20(木) 20:10:12
ありがとうございます。修正してコンパイルしてみたんですけど、
今度は「23:呼び出し時のパラメータが足りない」と出ました…
929デフォルトの名無しさん:2007/12/20(木) 20:15:25
siguma()内で呼び出してるsiguma()の引数が足りてないだろ
930デフォルトの名無しさん:2007/12/20(木) 20:16:06
siguma(a, d, n - 1)
931デフォルトの名無しさん:2007/12/20(木) 20:19:21
a + a+d + a+2d + a+3d +・・・+ a+(n-1)d
= na + d { 1+2+3+・・・+(n-1)}
=na + dn(n-1)/2
だろう
932928:2007/12/20(木) 20:33:22
>>929>>931ありがとうございます!
>>931のとおりにやったらできました。
933デフォルトの名無しさん:2007/12/20(木) 20:33:52
fcloseをしてないときにエラーだすのってどうやるの?
934デフォルトの名無しさん:2007/12/20(木) 20:35:06
そりゃ>>931でやれば一発で出るが、再帰関数の勉強してたんじゃないのかw
935デフォルトの名無しさん:2007/12/20(木) 20:53:14
再帰関数(の勉強している事)すらしらないほどなんだろう
936デフォルトの名無しさん:2007/12/20(木) 20:56:30
2.980000 8.999000
2.979900 10.197000
3.999600 10.494990
5.049099 10.894950
6.138594 11.399860
6.278580 12.013719
8.479952 12.741577
9.754110 13.589572
11.113067 14.564983
11.569565 15.676290

こんな感じの表示をこういう風に整えたいんですかどうすればできますか?
2.980000  8.999000
2.979900  10.197000
3.999600  10.494990
5.049099  10.894950
6.138594  11.399860
6.278580  12.013719
8.479952  12.741577
9.754110  13.589572
11.113067 14.564983
11.569565 15.676290


各行はfor文の1回のループごとに出力されます
937デフォルトの名無しさん:2007/12/20(木) 21:04:48
printfのフィールド幅指定はだめか?
938デフォルトの名無しさん:2007/12/20(木) 21:05:06
詳しくお願いします
939デフォルトの名無しさん:2007/12/20(木) 22:11:50
>>938
printf("%-10d %-10d", a, b);
-は左揃え、10は桁数
あとは分かるだろ
っつか、printfぐらいぐぐれよw
940デフォルトの名無しさん:2007/12/20(木) 22:13:27
あ、小数点入れるのか
%-12.8dぐらいがいいかな
941デフォルトの名無しさん:2007/12/20(木) 22:22:34
なんでdなんだよ(w
942デフォルトの名無しさん:2007/12/20(木) 22:24:55
ごめんf www
しかも\nもないwww
943デフォルトの名無しさん:2007/12/20(木) 22:51:46
>>933
fopen/fcloseをラップして開いていくファイル数をすべて管理してプログラム終了時点にチェックする

fcloseしたFILE *がどうなってるかって処理系依存?
nullでも代入しといてnullになっていないFILE *が閉じていないとかできるかと思ったけどだめっぽいな
944デフォルトの名無しさん:2007/12/20(木) 23:29:22
ちょっと失礼します。
break文が何故かうまくいきません。
下のプログラムのbreakの使い方間違ってますか?
キーボードからの読み込みを何かの条件でbreakしたいんですが…
教えてください

char a[100],w;
char *cpt;
int i;
cpt=a;
printf("please input strings:");

for(i=0;i<100;i++){
scanf("%c",&cpt[i]);
if(cpt[i]==w)break;
}
for(i=0;i<100;i++){
if(cpt[i]==' ')for(i=i+1;i<100;i++){printf("%c",cpt[i]);
}
}

945デフォルトの名無しさん:2007/12/20(木) 23:34:37
変数wが初期化されておらず、中にどんな値が入っているか不明なまま使っているのが問題。
946デフォルトの名無しさん:2007/12/20(木) 23:37:51
>>944 >>945に加えて・・・
scanfをforで回しても、おそらくおぬしの意図した動作はしないぞ。
あと、出力処理の周辺が意味不明。
for文が2個あることも、ifがあることもワケワカメ
947デフォルトの名無しさん:2007/12/20(木) 23:52:42
>>945-946
レスありがとう

初期化しても駄目なんです…
わしが意図してる動作はどうすれば可能なのですヵ?

出力に関しては空白があったらその後の文字を表示させるというものです。
何とかbreakできればうまくいくと思うんです。
948デフォルトの名無しさん:2007/12/21(金) 00:00:30
>>947
その、wを初期化した部分を晒せ。
949デフォルトの名無しさん:2007/12/21(金) 00:09:46
>>947
そもそも何でbreakしたいんだ・・・
空白を含めすべて文字列を読み込むんで、出力のとき空白までを無視すればいいじゃないか
950デフォルトの名無しさん:2007/12/21(金) 00:35:38
>>948-949

w=0;
こんな感じです。

>空白を含めすべて文字列を読み込むんで、出力のとき空白までを無視すればいいじゃないか

それができたならこんな苦労してないですよ…
どうやって空白までを無視できるんですか??
951デフォルトの名無しさん:2007/12/21(金) 00:39:01
isgraph
952デフォルトの名無しさん:2007/12/21(金) 00:43:18
キーボードからとある文字を受け取ったらループから抜けたいんでしょ?
なら
forループ内にifいれて
strcmpで比較して一致の場合にbreakでループぬけりゃいいんじゃね?
953デフォルトの名無しさん:2007/12/21(金) 00:53:00
>>951-952

isgraph、strcmpかぁ
頑張ってみますわ
954デフォルトの名無しさん:2007/12/21(金) 01:05:21
よく使うのが
if( strcmp(str,"end") == 0 ) break;
endと入力したら一致でループ脱出
955デフォルトの名無しさん:2007/12/21(金) 01:17:53
>>954
ありがとう
う〜ん、何故か文字化けが発生してまう
956デフォルトの名無しさん:2007/12/21(金) 01:37:35
>>950
そりゃどう引っ繰り返したってbreakしないわけだ。
その理由が判らないなら、そんなカスみたいなコードは捨てて入門書をきちんと読め。
957800,892:2007/12/21(金) 01:46:03
>>893-897,900
ありがとうございます。
用途によって使い分ければ良いということですね。

>>899
工夫してみます。

>>901
>Cの用途を考えるとそうむやみに使うもんでもない。
Cの用途とは?
OSやアプリケーション、組み込みに至るまでソフトウェア開発で広く使われている言語という認識でしたが、
リスト構造が不向きな用途とはどのようなものか、
詳しく教えていただけるとさいわいです。
958デフォルトの名無しさん:2007/12/21(金) 01:54:06
ORZ式C言語入門
オワタの教える簡単C言語

とか執筆しようかな
959デフォルトの名無しさん:2007/12/21(金) 02:10:57
>>944


char a[100];
char w='0';
char *cpt;
int i;
cpt=a;
int chk=0; /*空白を探すときのチェックフラグ*/
printf("please input strings:");

for(i=0;i<100;i++){
scanf("%c",&cpt[i]);
if(cpt[i]==w)break;
}
for(i=0;i<100;i++){
if(chk==1)printf("%c",cpt[i]; /*空白を通過していれば、次の行にてチェックフラグが1になっているので表示*/
if(cpt[i]==' ') chk=1; /*空白を見つけた時点でチェックフラグを1に。*/
}
960デフォルトの名無しさん:2007/12/21(金) 02:31:09
>>959
あんたも入門者?
w='0'って、何考えてるの?
961デフォルトの名無しさん:2007/12/21(金) 02:36:04
>944のやりたいことって、
char a[100];
fgets(a, sizeof(a), stdin);
printf("%s", strchr(a, ' '));
ってことじゃないのかね。
962デフォルトの名無しさん:2007/12/21(金) 06:51:14
>>957
>リスト構造が不向きな用途とはどのようなものか、

たとえば2分探索できるかどうか、考えてみなよ。
963デフォルトの名無しさん:2007/12/21(金) 07:54:49
まずは、標準ライブラリにどんなものがあるのか知るべきだ。
↓とか簡単なサンプルも載ってるので、面倒がらずに最後まで目を通すといい。
http://www9.plala.or.jp/sgwr-t/lib/libtop.html

ここも全てのライブラリを網羅してるわけではないが、参考にはなるだろう。
初心者ほど用意されているものを自分で作って、うまく動かなくて苦労してる人が多い。
動作を理解したり、拡張する目的ならそれもいいけどさ。
964デフォルトの名無しさん:2007/12/21(金) 08:59:26
質問させて下さい。

struct ABC stData[] = {・・・};
int num = sizeof(stData) / sizeof(stData[0]);
int num = sizeof(stData) / sizeof(struct ABC);
構造体の要素数を知りたい時、どちらの方法が常套手段なんでしょうか?

一番知りたいのは・・・↓
sizeof(stData[0])とsizeof(struct ABC)は等しいという事は、保証されていますか?
965デフォルトの名無しさん:2007/12/21(金) 09:16:57
>>964

sizeof演算子の結果はオペランドの型で決まるので、どちらでも同じ。
どちらが常套手段、と言うことはないだろう。好みの問題。
ちなみに規格票には
 sizeof array / sizeof array[0]
という例が載ってた。
966デフォルトの名無しさん:2007/12/21(金) 09:18:09
>>964
何かトリックでもない限り、問題ない。
前者はstDataの型が変わっても使えるメリットがある。
967964:2007/12/21(金) 09:27:33
ありがとうございます。
どちらかは、構造体の境界をパティングしたサイズで、
一方はパティングしていないサイズが出るのかと、
変な妄想してました。
968デフォルトの名無しさん:2007/12/21(金) 09:41:55
パディングされてないサイズなんか返されても、それでmallocできないじゃん
969デフォルトの名無しさん:2007/12/21(金) 13:01:55
do-while文の終了条件を教えてエロイ人☆
まじで卒業できないよう><
970デフォルトの名無しさん:2007/12/21(金) 13:02:48
>>969
中退でおk
もしくは転科汁
971デフォルトの名無しさん:2007/12/21(金) 13:46:47
>>969
ぱそこんのコンセントおぬけばしゅーりょーするとおもいますっ(>_<)
972デフォルトの名無しさん:2007/12/21(金) 14:16:04
>>696
俺はプログラムとかよくわからないけど自分じゃけっこうエロイ
と思ってるから教えてあげるよ
while();
の()のなかが偽になったら終了するらしい
つまり、0になったら終了する
なんかしらないけどカッコの中の式が正しいと1で正しくないと0になるらしい

x=1のとき
真(x=1)
偽(x=4)
973デフォルトの名無しさん:2007/12/21(金) 14:17:45
>>927
969だった
974デフォルトの名無しさん:2007/12/21(金) 14:20:37
Cのスレでそれはないだろう、せめて == で
975デフォルトの名無しさん:2007/12/21(金) 14:34:24
>>973
それは何かのギャグか?
976デフォルトの名無しさん:2007/12/21(金) 20:12:56
C言語を最近勉強し始めたものですが
C言語を動かすためにサイトを見てまわったんですが
そこで『Borland C++ Compiler』をインストールしてどう使うかのサイトを参考にしたんですけど
コンパイラはできたんですけど、実行ファイルをクリックしても画面が一瞬出るだけで
すぐに消えてしまうんです。何か解決方法はありますでしょうか?
ちなみにOSはVistaです。
977デフォルトの名無しさん:2007/12/21(金) 20:15:55
>>976
プロンプトで実行
978デフォルトの名無しさん:2007/12/21(金) 20:23:19
もうコマンドラインなんてのが時代遅れなのでしょうかねぇ
979デフォルトの名無しさん:2007/12/21(金) 20:29:18
bccのGUIラッパーでも作って配布しようかなあ……y
980デフォルトの名無しさん:2007/12/21(金) 23:44:40
C言語でプログラミングを始めようと思い、Visual C++2008をインストールしたばかりの超初心者です
早速入門サイトに乗っていたコード(Hello worldの表示)を打ち込み、コンパイルしようと思ったのですがやり方が分からなくてかれこれ2時間ほど固まっています
「ビルド」というのはどこをどうすれば出来る処理なのでしょうか
981デフォルトの名無しさん:2007/12/21(金) 23:47:53
>>980
2005だとメニューにビルドがあるけど、2008だと違うのだろうか。
982デフォルトの名無しさん:2007/12/21(金) 23:50:40
>>980
VCの仕様変更がされてなかったら、F7でビルド、Ctrl + F7でコンパイル。
983デフォルトの名無しさん:2007/12/21(金) 23:52:08
プロジェクトを作成してないとメニューにビルドがでないな
984923:2007/12/22(土) 06:03:05
おっかなびっくりで前に進めました、>>924さんどうもありがとうございました。

実行時エラーと戦ってるので近いうちにまたくることになりそうです(;´д⊂)
985質問:2007/12/22(土) 10:38:52
C言語で作れる方ご教授願います。
名前:山田 太郎
カナ:ヤマダ タロウ

上記のように、名前欄を入力した場合、カナ入力欄に自動で入力させる
方法を調べております。
どなたか、ご教授宜しくお願いします。
986デフォルトの名無しさん:2007/12/22(土) 10:53:27
987質問:2007/12/22(土) 10:58:59
失礼しました。
>>986

C言語で作れる方ご教示願います。
名前:山田 太郎
カナ:ヤマダ タロウ

上記のように、名前欄を入力した場合、カナ入力欄に自動で入力させる
方法を調べております。
どなたか、ご教示宜しくお願いします。
988デフォルトの名無しさん:2007/12/22(土) 11:01:04
重要なのは二行目の方じゃねw
989デフォルトの名無しさん:2007/12/22(土) 11:22:06
>>987
山田 ヤマダ
佐藤 サトウ
太郎 タロウ
花子 ハナコ

って辞書もっとけばいいじゃん。
何も難しいことはない。
990質問:2007/12/22(土) 11:33:56
>>988
すいません。
IMM32は、候補を出す機能のことですか?
名前:入力時、入力のタイミングで同時に入力できる方法もここにありますか?

名前:山
カナ:ヤマ

すいませんが、ご教示宜しくお願い致します。
991質問:2007/12/22(土) 11:37:44
>>990>>988
ご回答有難うございます。

辞書についても考えましたが、入力した、キー反映型での
カナ入力方法でないと、何通りもある、名前から一発表示できないと
考え質問させて頂いております。
992デフォルトの名無しさん:2007/12/22(土) 11:44:39
ソケットって何のために使うの?
2つにファイルわけて分かりやすくするの?
サーバとかワケわからないんだけど
993デフォルトの名無しさん:2007/12/22(土) 11:44:40
Windowsなんでしょ?imm32でぐぐれって
994デフォルトの名無しさん:2007/12/22(土) 11:47:38
>>990
OS書けよボケ

Windowsならimm32ってヒントが出てるんだから、
更に質問する前に自分でちょっとは調べろよ。
995デフォルトの名無しさん:2007/12/22(土) 11:47:52
>>992
キミの部屋にあるコンセントと、それに繋がっている電気機器を考えるんだ。
996デフォルトの名無しさん:2007/12/22(土) 11:51:40
997デフォルトの名無しさん:2007/12/22(土) 11:54:55
#ifdef の typedef 版は何になるのでしょうか?
998デフォルトの名無しさん:2007/12/22(土) 11:56:06
ない。互いに全く関係ない機能だ。
999デフォルトの名無しさん:2007/12/22(土) 11:59:18
#ifndef bool
#define bool
#endif
見たいな感じで typedef int bool; が定義されてたら、宣言しない見たいなのは無理でしょうか?
1000質問:2007/12/22(土) 11:59:58
>>993
自社ソフトにて、顧客入力箇所があり、
名前:とカナ:で入力箇所が異なるセル内で、同時入力ができれば
と思い、質問させて頂いております。

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