過去スレのアドレスって意味があるのか?
見ようと思えば見れる人がいる以上、無意味とは言えない
つかプログラム中でpwdで 現在のディレクトリの場所確認して そこのファイルを指定することできる?
>>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 = "" 等は書いても書かなくてもいいのでしょうか?
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個くらいの別のディレクトリに入ってるファイルに対して 同じプログラムをかけないといけない場合どうしますか? どういう風に実行していきます? ルートディレクトリから指定したらそのパソコンでしか使えないでしょ。
>>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); } 」
16 :
デフォルトの名無しさん :2007/12/02(日) 19:28:26
enumって「イーナム」と読むと思ってたのに、「エナム」なんだ?
C言語の中で他のexeファイルを実行するやり方を教えてください。
#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; }
>>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で配列の初期化を行っていると書いてあるのですが、
具体的な操作の説明が書いてなく困っています。
誰か分かる方、説明お願いします。
>>20 >for(i=0;i<=51;i++)
>{
>wDeck[i].face=i%13;
>wDeck[i].suit=i/13;
>}
見たまんまじゃん。
どこがわからんの。
何がわからないのかこっちが聞きたいくらいだよ
25 :
デフォルトの名無しさん :2007/12/02(日) 19:45:03
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 *)と、*がついているのは何故ですか?
int *型に変換してるから。
>>26 int は -2147483647〜2147483647 なので、4294967295 は表現できないから無理
>>26 strtolとかsscanfでlongにするとか
31 :
デフォルトの名無しさん :2007/12/02(日) 20:15:35
>>27 (int)はキャストじゃなくて、sizeof(int)の一部。
sizeof()で演算子になってて、()内の物のサイズを計算する。
sizeof(int)だと、int型のサイズ。
32ビット環境だとlongでも32ビットか。うっかりしてた。
a long long int...
strtollだな
35 :
デフォルトの名無しさん :2007/12/02(日) 20:33:06
>>28 int *型とは??
ポインタ型変数とは、int型の普通の変数のアドレスを持っている変数
って意味ではないんでしょうか?
>>31 すみません。多分、誤解だと思うのですが、私が言っているのは、
(int *)malloc
の、 ↑この部分の * のことです。分かり辛くてすみません!!
36 :
26 :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;
}
>>35 うーん・・・。
intポインタは「intを指すポインタですよ」ってだけ。
*intでアドレス先のデータをintとして処理する。
だからmalloc(sizeof(int) * 10)で確保した領域を
int *ですと教えないとintとして使えない。
(int *)にキャストする事によって
(*heap)や*(heap+1)やheap[2]という形でint配列としてアクセスできる。
39 :
デフォルトの名無しさん :2007/12/02(日) 20:56:52
>>37 む、難しい・・・
*(heap+1)はどういう意味ですか?
>>38 そこが肝ですね!分かりました。
40 :
26 :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が文字コードなので期待しているとうりに使えるかどうかがわかりません。
malloc()のキャストはK&R時代の古い書き方だと思うが。 C89以降は暗黙的に型変換されるのでキャスト不要のはず。
44 :
デフォルトの名無しさん :2007/12/02(日) 21:21:18
C言語による台形法のプログラムを作ったのですが、結果がうまく出ません そうゆう場合の質問はこちらでよろしいのでしょうか?
親切な奴が居合わせれば見てくれるんじゃね?
>>40 桁数が同じならいける場合があるけど違うならダメ
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); } 計算部分のみ載せました。変なとこあったらご指導お願いします
>>47 x^2積分したら0.33なったぞ。
どんな問題があるのか説明すれ
49 :
26 :2007/12/02(日) 21:36:25
>>47 intとdoubleの間の算術演算はdouble精度で行われるから、キャストいらんよ
51 :
26 :2007/12/02(日) 21:37:49
53 :
52 :2007/12/02(日) 21:41:27
ごめん、嘘ついた 特におかしいところは無い気がするんだが…
>>48 すみません、説明足らずでしたm(_ _)m
私は積分区間0〜1、fn=4*sqrt(1-x*x) で分割数を変えて誤差を測りながら実行してみたんです(積分計算すれば結果はπ)
本来なら分割数を倍するごとに誤差は1/4ずつ小さくなるのですが、私の場合綺麗に1/3ずつ小さくなってってしまうのです
-1.14159 -0.40954 -0.14648 -0.05177... といった具合に
それで、台形法のプログラム自体に手落ちがあるのではないのかとこちらに相談しに来た次第です
Borland C++Compilerがほしいのですが、さすがにこの情報漏洩の時代、会員登録はしたくありません。 どなたか.zipでください。
>>55 誰にも身分を明かさぬまま、スパイのごとく一生を送るといいよ。
>>50 ありがとうございます。修正しておきます
>>52 私も何度も見直したのですが、何が駄目なのかさっぱりです(T_T)
逆に、BCC以外のコンパイラを使うって発想はないのか?
59 :
57 :2007/12/02(日) 21:57:17
プログラムにミスはないみたいですね・・・ そろそろスレ違いになるので数学板のほうでも覗いてきます 答えてくださった方々、ありがとうございましたm(_ _)m
なんか入門書とかについてくるらしいのでそっちの使うことにします。
>>54 代数で計算してみればいいけど、それで正しいよ。
#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; } 入力された文字をポインタを使って表示させたいんですが、 このままだと、表示されずに違う数字が表示されてしまうのですが・・・ 違いの指摘、よろしくおねがいします。
>>62 たぶんこう
×scanf("%d",&p1);
○scanf("%d",p1);
×printf("%d\n",p1);
○printf("%d\n",*p1);
>>63 ありがとうございます!うまく通ってくれました!
よろしければ、なぜそのようにしたら通ったのか教えてくれませんか?
scanfには変数のアドレスを渡すが、p1はすでにアドレスなのでそれ以上&を付けない printfの方は、*を付けなかったらアドレスを表示するだけ p1の指す先を見る場合は*p1
ありがとうございます!本当に助かりました、 ポインタのこの部分がずっとわからなくて今日なんとか克服しようと 頑張っていましたが、やはりつまってしまいました。 わかりやすい説明のおかげでスッキリしました。 本当にありがとうございます。
まぁそこらへんのポインタの理解が第一の難関だろうね
>>22-23 うわー・・・事故解決しました・・・
理解した瞬間、今までの自分が理解出来なくなりました;;
スッキリしたのでmapionで遊んできます。
レスサンクスでした。
またそのうち来ます。
セグメンテーションエラーとか構文エラーは最近ここちいいんだけど nanとかinfとかでるエラー一番きらい。
お聞きしたいんですが、 キーボードから2つの整数を読み込み〜 ってのと、 キーボードから整数を二つ入力し、変数a,bに格納する。 って、同じことですか??
うん
もし違うとしたら…
ものすごく初歩的な質問なのですが 先日、やさしい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」と表示され、なぜか出来ません。 本書に書かれているありがちなミスの例には ・「;」が「:」になっていませんか? ・「半角」で入力されていますか? ・入力場所は合っていますか? といったものが挙げられているため、上記について何度も確認をしてみたのですがそれらしいミスは自分には見つけることが出来ませんでした。 私一人では解決できそうに無いので、どなたかお力を貸していただけるとありがたいです。
C言語を用いて文字の表示だけならそんなstdlibとか、int mainの後のゴチャゴチャなんかいらないんじゃないの? よっぽど難しい本だな。
コピペしたら普通に動いたがな ソフトといやらの使い方間違ってんじゃないの?
>>75 なんかめんどくさい書き方だなw
実際test表示するだけなら
#include <stdio.h>
main(){
printf("test\n");
}
だけ書けばおk。この書き方がいいかどうかは知らんがw
エラー文が「Projest is not compiled」
って表示されてるってことは、コンパイルせずに
いきなりプログラムを実行しようとしてるんじゃ…
79 :
デフォルトの名無しさん :2007/12/03(月) 00:59:46
>>75 「コンパイルできてません」てエラー出てる様に見えるけど?
80 :
75 :2007/12/03(月) 01:09:18
どうやら、
>>77 の仰るとおりソフトの使い方が間違っているようです
>>78 をコピペしてみましたがエラーが出てしまいました
「Project is not compiled」と表示される原因も解明し、
>>78 、
>>79 の予想が見事に的中しコンパイルせずにプログラムを実行させてました
このまま同じソフトを使用し続けても打開できそうに無いので、もっと使いやすいソフトを模索してみようと思います
レスを下さった皆様、こんなくだらない質問に付き合っていただき誠にありがとうございました
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;
}
84 :
75 :2007/12/03(月) 01:25:19
>>82 私の考えが愚かでした
自分の理解力、技術力、英語力を棚に上げソフトのせいにしようとしていました
レスありがとうございます、やはり現在使用中のソフトでもう少しだけ頑張ってみます
プログラミング等に詳しい友人がいないので、自分に合った入門者向けの書籍や使用中のソフトの参考書を探して日々精進したいと思います
規模の大きいプログラムを作るときにやはりassertは大量に使うものなの?
3文字続けて入力→配列へ入れる 場合はどのように書けばよいのですか? char [3]; sacanf("%c",&a,&b,&c);
char a[3]; scanf("%c%c%c", &a[0], &a[1], &a[2]);
2バイト文字についての質問なのですが char aaa[] = "あいうえお"; と宣言したとします。これを あ い う え お と表現したいです。この場合"あ"という文字のみ表現したいのですが どのように書いたら宜しいのでしょうか? pritnf("%s%s",aaa[0],aaa[1]); 無理でしょうかこれは
試せよそれくらい。 腐るほど試して教科書読んで試してから わからなかったら書き込め。
今年1年研究のために腐るほどプログラム書いたけど 計算結果より計算量と勝負するのはいやだ。
>>89 すいません、何通りか試した結果エラーで表示されないので質問しました。
解説読んだ限りですと、2バイト使用なのでアドレス2個表示すればいいのかな?
と思ったのですが2バイト分を指定して表示するという方法が思いつかないもので・・・
そりゃ%cのところを%sにしたらエラーが出るわなぁ
構造体配列にメンバは何個くらいが理想? たくさん使うプログラムは危険?
>>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
ググレ
97 :
95 :2007/12/03(月) 04:33:24
>>96 95です。解決しました。
ありがとうございました。
const int a = 5; int b[a]; て、できる?
C99なら別に int a=5; int b[a]; もできるけど。
ある文字定数がyかYなら実行、ってのをやりたいんだけど。 俺はこう書いたんだ if(answer == 'y' || answer == 'Y' ) これをもうちょっと縮めて書くことはできない? 条件増やしまくるとマンドクサくなるんだが……。
int tolower(int c)か?
コードを短くすれば必ず効率よくなるってわけでもないから、無理に短くする必要もないと思うけど。
このスレの対象者的には、効率よりもまず可読性を最優先するべき。 一目見て何をやってるか判断できるような書き方を徹底したほうがいい。 組み込み系のような非力な環境や画像処理でもない限り、処理速度が問題になることはそうそう無い。 効率はプログラム完成後にプロファイラ使って、時間食ってる関数を重点的に修正すれば劇的に改善する。 そもそも中級〜上級スレ向きの話題だしな。
>>100 #define ANY_CASE_MATCH(v,lc) ((v) == (lc) || (v) == (lc) + 'A' - 'a')
if(ANY_CASE_MATCH(answer,'y')){}
>>103 可読性重視ならよけいに100のままで良くね?
>>105 >103は暗にそう言っているのではないか?
107 :
デフォルトの名無しさん :2007/12/03(月) 15:56:41
以下読解力スレ。
for(i=max;i;i--) if(!flg[i]) statement; を for(i=max;i && !flg[i];i--) statement; と書くと同じようには動きません。 何故でしょうか。
for文の括弧の中の2番目の式はループの終了判定だぞ。
>>108 違うように書いているのだから、同じように動かないのは当然ですね。
>>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]が読み取られないじゃねえか馬鹿野郎
112 :
108 :2007/12/03(月) 16:59:20
初めてC言語をやるんですけれども 皆さんコンパイラはどれをつかってるんですか?
BCC
>>114 マイクロソフト社のビジュアルスタジオだっけ?
あれってC++とかしかないんだよね?
MSのビジュアルスタジオをどう略したらBCCになるんだよ
117 :
デフォルトの名無しさん :2007/12/03(月) 18:44:40
↓ ↓ ↓ マイクロソフトのビジュアルスタジオ ↓ CVC ↓ CBC ↓ BCC
118 :
デフォルトの名無しさん :2007/12/03(月) 18:46:38
BCC developer
ちがうってww 聞いたんだよ・・・ ビジュアルスタジオっていうのはC++しかないんだよねって だから俺もBCCとか使おうかなって意味です・・
分かったから使え
根本的に勘違いしている気がする
122 :
デフォルトの名無しさん :2007/12/03(月) 19:08:09
>>119 ビジュアルスタジオはVB,VC++,VC♯が入ってるくさい。
CD付の入門書買えよ
もちろん、VC++はCコンパイラの機能も持っている。 普通にプロジェクト作ると、拡張子cのファイルもC++としてコンパイルしてくれるけど。
125 :
119 :2007/12/03(月) 19:20:39
>>1読んだけど名前にレス番入れるの忘れてた・・ 無知な俺にいろいろ教えてくれてありがとう C++はCからの派生ということだと思っているんだが C++はC+αってことでいいのかな? ならVC#をDLすればCもC++もコンパイルしてくれるってこと?
1にはC++はスレ違いって書いてないか?
127 :
デフォルトの名無しさん :2007/12/03(月) 19:33:39
C++はCを含むが、C#とC++は別
128 :
デフォルトの名無しさん :2007/12/03(月) 19:34:40
初心者はBCC developer
そんなとこ悩むんだったらlinuxいれりゃあいいのに すぐわかる。
>>127 間違い。C++はCのうち重要な機能が割愛されていたりするので要注意。
# まぁ、入門レベルじゃ関係ないが。
>C++はCのうち重要な機能が割愛されていたりする そんたのあったっけ?後学のために教えてくれ。
可変長配列とか可変個数引き数マクロとかrestrict修飾子とか? (´・ω・`)どうせc99乙って言われるがな
重要かどうかはともかく、C++では 暗黙の型システムの侵犯につながる機能があちこち塞がれている。 void*から他のポインタ型への暗黙の変換がないことはその最たる例。
134 :
デフォルトの名無しさん :2007/12/03(月) 20:17:40
3次元配列って、Excelで言うとセルにつけられるコメントみたいなイメージ だったんですが、違うんでしょうか?
135 :
デフォルトの名無しさん :2007/12/03(月) 20:19:47
C++ではCの文法も使えるんじゃないの?
VC2005ExpressとBCCのリンクくらいは、テンプレに入れといたほうがいいのかね… 個人的にはTurbo C++ Explorerも真のRADでいい感じなんだが。 コマンドラインでのコンパイルもbcc32.exeで可能だし、BCCと使い勝手は変わらない。
ワロタ
>>135 現在のCの文法の概念が
C++から取り入れられてるのが多い。
141 :
デフォルトの名無しさん :2007/12/03(月) 20:35:16
>>140 マジすか?
Cで書いたソースを、まんま拡張子だけ.cppに変えてコンパイルすると
通るって聞いたけど。
「通る」と「通る場合がある」との区別をつけないと
厳密に言えば、という話だろ。 実際のところ、Cのみの処理系なんてもうほとんど存在しないんだし、 だいたいの人はC++処理系をC処理系として利用してるだろう。そんなに気にすることじゃないよ。
>>141 malloc()の戻り値を適切な型にキャストしてなきゃ通らんだろうし
っていうか、それなんて言うコンパイラ?
145 :
デフォルトの名無しさん :2007/12/03(月) 20:43:29
マジで!通らない場合もあるのか! 頼むよ、猫!!orz ちなみに UNIX C と、Windows C はどう違いますか?
大雑把に言えば、POSIX関数が使えるかどうか。
147 :
デフォルトの名無しさん :2007/12/03(月) 20:48:08
コンパイラにもよるが、拡張子でCソースかC++ソースかを判別してコンパイルする。 中身がCソースで拡張子がcppの場合は、C++ソースとしてコンパイルするので問題になる可能性がある。 つまり、C++としてのCへの準拠度の話なわけだ。 もちろん、拡張子がcppでも、コンパイラにCソースとしてコンパイルするようオプションを指定すれば問題無いはず。
>>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]={ {"笑","笑","笑","笑","笑"}, {"笑","笑","笑","笑","笑"}, {"笑","笑","笑","笑","笑"}, {"笑","笑","笑","笑","笑"}, {"笑","笑","笑","笑","笑"} };
char hairetu[][5][5]
153 :
デフォルトの名無しさん :2007/12/03(月) 20:56:25
char* hairetu[5][5]だろ
>>147 その人は糖尿病医やってるけど暇と金をもてあまして
VS購入して「こんな事できるんだぜ」って自慢したくて
しかたがないプログラマーだからね
155 :
デフォルトの名無しさん :2007/12/03(月) 20:57:54
>>154 そうなんですか。いいこときいた。
猫に理解できる筈ないですもんねぇ。。
156 :
デフォルトの名無しさん :2007/12/03(月) 20:59:18
>>154 コードはどうしようもないけどお世話になったよ「猫でも」には
>>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++よりは速そう
>>157 >VC2005やBCCなどのC++処理系を使っても
なんと無く違和感あるな。
C++コンパイラとしてもCコンパイラとしても動くんであって、
別にC++の処理系使ってCのソースコンパイルしてる訳じゃないんじゃ?
165 :
デフォルトの名無しさん :2007/12/03(月) 21:30:56
>>162 でも今求められてるのは、VC++なんです。死亡するしか・・・
何が分からないって、レジストリとかINIファイルとかが分かりません・・・。
これらの扱い方を知るのにはどのくらいかかるでしょうか?
C言語では頭にstatic,auto,constなどがつくと、型宣言を省略すると自動でintにするそうですが、 C++ではできなくなったことを考えると、やはり推奨されない書き方なんでしょうか?
>>167 VBじゃないんだから
適切な型を適切な場所に書きましょうや
169 :
デフォルトの名無しさん :2007/12/03(月) 21:38:24
170 :
167 :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
只今VC++を使っています。 DOS窓からコンパイル、実行しようとしてもできないのですが
174 :
デフォルトの名無しさん :2007/12/03(月) 21:57:32
>>172 了解しました!ありがとうございました!!
>>173 それくらい自分で調べないと、先は厳しいぞ?
はっきり言って、プログラミングは調べ物のオンパレードだ。
176 :
デフォルトの名無しさん :2007/12/03(月) 22:01:50
>>173 VS2005コマンドプロンプトを開いてそこからコンパイルしる
>>175-176 どうにか解決できました・・・
type 名前.cで一度開かないとだめみたいでしたね
わからないことが多すぎ
これじゃぁ先が思いやられるなorz
いや、それは間違ってるだろ
え・・・ 違うのですか? できれば教えてほしいのですが
>>180 Platform SDKをインスコすればいいのですね?
>>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
>>182 それをやるとどうなるの?
180のやつですぐコンパイルできるんじゃないのですか?
初心者過ぎてすいません><
>>186 ありがとうございます
アプリケーションからOSを操作することによってどうなるのですか?
188 :
デフォルトの名無しさん :2007/12/03(月) 23:10:31
構造体というのは、 struct s1 { int num; }; のように、中のメンバを1個にするなら、あまり意味がないと思っていいのでしょうか?
>>188 敢えてそうしているプログラムがあるなら、何か理由があるのでしょう。
普通は、そういうところにこそコメントを書いておくものですが。
190 :
デフォルトの名無しさん :2007/12/03(月) 23:13:54
アプリケーションからOSを操作することによって アプリケーションからOSを操作することができます。
>>187 アプリケーションからOSを操作したいんですか?
>>190 アプリケーションからDOS窓を操作できると考えていいのですか?
DOS窓からコンパイル DOS窓から起動
194 :
151 :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])が使えず参っています。
#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行目に ) が必要だとエラーが出るのでしょうか? )を足しても )が必要だと言われ続けます。)の数は間違ってないと思います。
>>187 待て。
DOS窓はOSじゃない・・・とも言い切れないがなんか違う。
うまく簡単に言えんなぁ。
ようは、マウスから入力してWindowsを操作する(GUI)のではなくて
キーボードから文字を打ち込むことでWindowsを操作する(CUI)ためのアプリだ。
WindowsXPだと、スタートメニュー→全てのプログラム→アクセサリ→コマンドプロンプトだ。
>>195 int testchk(char str[]) {
>>195 確かめてないけど、
int testchk(char str[]) {
こうちゃうか?
char[] strとかってC++はそう書けたっけ?
Cなら他には char* strとか?
>>195 あなたは間違っていません
世の中のCコンパイラが間違っているのです
これでいい?
>>195 int testchk(char str[]) {
printf("%s", str);
return 0;
}
>>196 マウスから操作するのではなく
キーボードで操作するところまでは理解できました。
アプリケーションでOSを動かすというのは
例えば
普通はマウスでDOS窓を開いた場合はアプリケーションでOSを動かしたとは言わない
しかしキーボードから文字を打ち込みDOS窓を開いた場合(開けるかわからんが)はアプリケーションでOSを動かしたといえる
こんな感じですかね?
>>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のアプリをもう一個動かしたと表現するなら理解出来そうな気がする。
>>201 意味が分からないんだけど、複雑に考えすぎじゃない?
そもそもアプリケーションでOSを動かすってどこから出てきた?
>>201 >アプリケーションでOSを動かす
>>187 =
>>201 なら、「アプリケーションでOSを動かす」という言葉は忘れろ。
誰もそんなことは言ってない。
Windows(またはDOS窓)には「環境変数」と言うものがあって、
VC(またはcl.exe:コンパイラ)は、実行するときにその「環境変数」から動作環境を取得する。
その環境変数の設定が
>>182 であり、
>>184 でいう「VS2005コマンドラインのセットアップ」
それぞれの環境変数(動作環境)の意味は、まずは知らなくても良いと思うよ。
206 :
デフォルトの名無しさん :2007/12/03(月) 23:45:46
「OSを動かす」定義って何だ? OSに対して何かのリクエストを働きかけて結果のレスポンスを得る事が 「OSを動かす」事でいいの?
そもそもどこから OS なんて言葉が出てきたんだ?
もう1つ。 お前は 「コンパイルする方法を知りたい」 のか? 「DOS窓からコンパイルする方法を知りたい」 のか?
皆さんごめん・・・
なんかややこしくなってきたorz
とりあえずC言語が終わったらその意味を調べることにするよ
ありがとうございました
>>208 コンパイルする方法をしりたいです。
DOS窓からはtype 名前.cで読み込ませcl 名前.cでコンパイルしたんだけど
なんか違うらしい・・・
できればコンパイルの方法を教えてください
>>209 >とりあえずC言語が終わったらその意味を調べることにするよ
今調べなさい
>>207 えーと
APIを導入するみたいなことで・・・
APIとはアプリケーションからOSを起動するみたいなことだったから
>>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 ; }
>>211 起動じゃないな
処理を依頼するって感じ
APIによっては機能を借りるとか
>>212 もちろんそういうAPIもある。ExitWindowsExだっけ?
>>212 で、それがしたいのか?
かいつまんで調べるんじゃなくてコマンドラインについて勉強してください
>>209 VC++立ち上げてメニュー項目のツール選んだらドロップダウンの
項目の中にVS2005コマンドプロンプトってのがあるでしょ?
それを開いたらパスの通ったいわゆるDOS窓ってやつが開くから
そこからcd..でコンパイルしたいファイルのあるフォルダに移動して
そこでcl.exeを使用してコンパイル出来る。
ファイル名を指定して実行でcmdって打ってコマンドプロンプト
開いてもそれはパスの通ってないコマンドプロンプトだから意味無い
ていうか、普通にIDEの機能使ってコンパイル・実行してれば
良いじゃん
218 :
213 :2007/12/04(火) 00:35:52
別スレで質問した方がよさそうですね。 お邪魔しました。
>>218 すいません
俺のせいで・・・
とりあえずもう一度調べてまた来ます
221 :
デフォルトの名無しさん :2007/12/04(火) 00:50:15
プログラミングの合間に出会い系
■最近流行りのSM系サイトを知っていますか?
それは「SMプレイをすること」を最終目的とした人達が集まる出会い系サイトのことです。
普通の出会い系サイトと一味違った、熱い出会いが全国各地で繰り広げられています。
《ブログ SM系サイトが会える訳》
http://smsite.blog123.fc2.com/ ブログでは管理人一押しのSM系サイトを紹介しています。
是非ご利用下さい。
うーん、どうもPlatform SDKをたいそうな代物と思い込んでるみたいだな。 Platform SDKを入れる目的はC/C++のネイティブコードを生成するためだ。 何故なら、VC++2005Express単体では.NETベースのアプリしか作れないから。 もちろん人によってはWinAPIを使うためでもあるんだが、それはWindows GUIプログラムを やるようになってから気にすればいい話で、入門には全く関係無いと思っていい。 だからとりあえずは、「.NET用のコンパイラをC/C++に対応させるために必要」とだけ考えればいいよ。 …って、もういないのか。
#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 とか書くので・・・あちゃー・・・。 こりゃ間違いに気づかないわ・・・。
>>222 ただのC/C++プログラム書くだけだったら、ただのVC++ EEでも
標準C/C++ライブラリは使えるし、
コンパイラもネイティブな機械語吐くしで、
Platform SDK要らなくないか?
>>194 そもそも「笑」が2byteだということを理解してる?
>>225 Javaはcharって2byteだよね。C言語のcharは1byteだから 「笑」は1つの要素内には入りきれない
って事か。他の人の質問だけどオレも思い出しつつ勉強になるw
wchar_tなら2byteだな
4byteかもしれんぞ
日本語と英語が混じった文章から、日本語のみを抽出する方法ってありますか?
あるよ
>>224 調べてみたが、どうやら標準C/C++のコンソールアプリだけならその通りらしい。
必ずPlatform SDKも入れてたからあんまり深く考えてなかったよ。
というわけで、Windows APIが不要ならばPlatform SDKは不要ということだな。
まあ入れておいても損は無いものだし、どうせ後で使いたくなるだろうから、
面倒くさいセットアップは最初に済ませておいたほうがラクだというのは変わらんが。
んなこたーない。その前にSDKのリビジョンが変わっているかも知れないし、 OSを再インストールしているかも知れない。
>>232 スマンが何が言いたいのかわからん。結論を述べてくれ。
>まあ入れておいても損は無いものだし、 >232 >どうせ後で使いたくなるだろうから、 そんとき入れれば充分。
与えられた個数の正の整数を格納している配列のうち、最大となる値を検出して、その値を 格納している配列要素の値を0に書き換える。すると新しい配列においては、もとの配列で 大きい方から数えて2番目の数値が最大値となっている。さらにもう一度、この新しい配列 における最大値を格納している配列要素の値を0に書き換える。するとこの時点でのさらに 新しい配列では、最初の配列において大きい方から数えて3番目の数値が最大となってい る。このことを利用して、下記のプログラムを作成せよ。 (ここで示した方法は、いわゆる整列(ソーティング)問題の1つの解法となり得るが、効率的 な方法ではない) まずメイン関数において、キーボードから正の整数の個数(100以内)を入力し、次いで実 際の数値を配列に入力する。そしてメイン関数はサブ関数に、入力した個数と配列を引数とし て渡す。 サブ関数は、これらの配列から、まず1番目に大きい数を見つけて、それを別途設けた配列 の先頭の要素に格納し、次に2番目に大きい数を見つけてこれをこの配列の先頭から数えて 2番目の要素に格納し、という処理を最後の数に至るまで繰り返す。これにより新しい配列に は大きい数から順に並んでいることになるので、これを引数を利用してメイン関数に渡す。(す なわちサブ関数は引数を3つ持つことになる。1つはデータの個数を示す変数、1つは入力デ ータを格納する配列、残りの1つはサブ関数で計算した結果を格納する配列である) 最後にメイン関数はサブ関数で計算された新配列の値を若い方の要素から順に(即ち大き い数から順に)画面に表示する。またこの数列の中央値を表示する(中央値に小数が含まれ る場合は、その小数を切り捨てた整数を表示することとする)。
宿題スレ池
>>228 あれ、wchar_tって4byteのこともあるの?
wのcharで必ず2byteだと思ってた
>>237 Linuxだと4byteだったりすることもある
詳しくないけど、内部表現がUTF-32なら4バイトになるんじゃないの? wchar_tって文化固有の言語をサポートする固定長の文字コードのことだったような。
#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; } ポインタ変数を扱う場合、配列( [ ] )として扱わず、間接参照演算子( * )を用いること。 これがわかりません・・・どうすればいいんでしょうか
>>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;
}
>>240 追記。
自分だけなら別にいいけど、人にソースを見せる場合とかは、
つめすぎず、ifやらwhileやらの行に{をつけず
改行してインデントをつけて{をつけると、ブロックが分りやすくなるよ。
っていうか自分で見てても分りやすくなってミスってる部分すぐわかる。
更に追記orz 説明忘れてた。 char型配列はアドレスが1づつずれてる(1Byteだから) だから*ポインタの指し示すアドレスの中身 (*は中身 &はアドレス) よって、bufの中身 *buf で そのbufが保存しているアドレス+iとかjとか、つまりカウントアップさせていっているから 1づつアドレスがずれて処理が出来るってこと。 ポインタは「アドレス」と「アドレスが示す中身」を把握すればどってことないよ
俺はポインタでも p[-1] とか普通に書くけどな…
>>240 要するに buf[i] を *(buf + i) と書け、ってことだ
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'; とすると実行時にエラーが発生します。 何故なのでしょうか。 よろしくお願いします。
>>246 なんでポインタのポインタなの?
意図は?
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の大きさはファイルから読み込むようにしたいのです
そんな無茶な
250 :
240 :2007/12/05(水) 10:25:57
ありがとうございます!! 勉強になりました!
>>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分解法でお願いします。
253 :
246 :2007/12/05(水) 11:01:07
そうですか・・・ ありがとうございました
>>252 初心者過ぎてわかりません。
日本語でお願いします。
>>246 方針としては、要素数が配列毎に一定なら二次元配列は諦めて配列で管理するようにすることを検討することをお勧め。
# 手頃でパフォーマンスも落ちない。
要素数も各配列毎にまちまちだったりするならポインタの配列として管理することになる。
それらが動的だったりするならリスト構造を使うことになるかな。
256 :
デフォルトの名無しさん :2007/12/05(水) 11:18:00
まだはじめたばっかで、出されたレポートがまったくわからないんです。 教科書見ても、載ってないので手が出ないんです。 先ほど連立一次方程式をGaussの消去法とLU分解法で解いて欲しいんです。
「先ほど」「解いて欲しい」とはまた面妖な。
>>252 上から順に(1)式(2)式(3)式とする。
(3)式から(1)式を引いて(4)式とする。
(2)式から(1)式を2倍したものを引いて(5)式とする。
(4)式から(5)式の3倍を引くとzが確定する。
(4)式に代入するとyが確定する。
(1)式に代入するとxが確定する。
260 :
252 :2007/12/05(水) 12:02:28
できればプログラムを見せていただきたい。
263 :
252 :2007/12/05(水) 12:20:40
了解した。
264 :
デフォルトの名無しさん :2007/12/05(水) 14:03:01
良すれ
265 :
デフォルトの名無しさん :2007/12/05(水) 16:06:06
データを取るためにファイルに数値をどんどん書き込んでいくプログラムを作っています 本などを見るとオープンするファイルの拡張子が.datとなっているものを よく見かけるのですが.txtとどう違うんですか?
プログラム言語以前の問題だな
>>265 c的には何ら変わりがない。
もしあんたが、拡張子毎に違うアクションを起こすようなGUIを使っているなら、違うアクションを割り当てることができるくらいの違い。
>>267 そうなんですか
ありがとうございました
>>270 文章から、アルファベットやら半角スペースを取り除くってのはどう?
普通にstrtokでwhitespaceとアルファベットと数字を全部区切り文字にしちゃえばいいんでないかい?
コード体系も明かさないというのにどうしろと
>>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向けの)最適化が載ってるな。
前にAPIについて質問させてもらったものですが・・・ ネイティブコード=機械語 SDKはネイティブコードが使えるようになる?でいいんですよね? C言語をコンパイルするとそれは機械語に変換されるのではないのですか? 質問がよくわからなくてすいません・・・
276 :
デフォルトの名無しさん :2007/12/05(水) 22:02:14
この前秋葉に行ったらメイドさんがたくさんいたんだが もう治安が悪くなってしまったのかな。 28歳だけど今からC言語勉強してもプログラマにはなれませんかね。
泣きごと言ってるだけじゃなれないのは確かだ。
>>275 SDK は Software Development Kit (ソフトウェア開発キット)の略
例えば Microsoft Platform SDK は MS プラットフォーム用のソフトウェアを
開発するために必要なライブラリとかヘッダファイルとかツールとかをまとめたもの
ネイティブコードがどうとかいったものではない
>>278 VC++だけではウインドウを表示したりすることができない
文字を表示することはできるが
ソフトウェアを作ることができない
そこでSDKを導入することによりC言語でソフトウェアが作成できるようになる
こんな感じで理解しておk?
280 :
デフォルトの名無しさん :2007/12/05(水) 22:45:06
,. -''' ´ ̄` '''- 、 / \ __/ ヽ / ′ _ ._ ` ̄`ヽ { ´・ .〈・ } `ーl r、_) ノ r''⌒`丶、 `ニニ' `‐t‐''´ ! \ / ヽ \ , イ \ `L__,, -‐'´ | \ ノ \ ! `'ー--‐'′ \__,ノ 星野カービィ
>>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」を代入してる?? 分からないことだらけです!教えてください!
>>281 ん〜
ウインドウを表示たりするプログラムが作れないってことでいいかな?
>>282 それは昔のCで使われてた古い書き方
int AAA(st)
STR_BB *st;
{
}
は
int AAA(STR_BB *st)
{
}
と一緒
OKの方は
#define OK 0
とかじゃねーの?
>>282 >int AAA(st)
> STR_BB *st;
ANSI前の古い書き方で、「int AAA(ATR_BB *st)」とほぼ同じ意味。
>int ddd = OK;
どこかで「OK」が#defineされてたりするんじゃないか?
コード上でなければ、コンパイル時に-DOK=1とか付いてるとか
気合と根性があれば、 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っていう関数??
初心者すぎてすみません!!
>>283 ありがとうございます
>>287 そうなんですか?
それは全部C言語でプログラムを組まないといけないんですよね?
あとVC++のアプリケーションからのコンパイル方法を教えてほしいのですが・・・
DOS窓からなら名前.cを作成できコンパイルできるのですが
VC++2005はc++ファイルしか作れなくて困っています。
>>288 >AAA(STR_BB *st)の、STR_BBは構造体でしょうか?
さぁ?
多分charかchar*かじゃないの?勘だけど。
どこかで#defineされてるかtypedefされてると思う。
>>289 >VC++2005はc++ファイルしか作れなくて困っています。
C++とプロジェクトは同じで良いから、
新しい項目→C++ファイル(.cpp)を選んで、ファイル名に「〜〜.c」まで書くか(ファイルがない場合)
既存項目の追加で「〜〜.c」を選択(既にファイルが有る場合)
>>290 一応できましたが・・・
なぜデバッグなしでビルドじゃないといけないんでしょうか??
292 :
デフォルトの名無しさん :2007/12/06(木) 01:53:44
>>290 構造体だったようです。
必ずしも、
AAA(struct STR_BB *st)としなくてもいいんですね。
構造体を関数に受け渡す方法を勉強すればいいでしょうか・・ありがとうございました。
>>277 どこかスレないでしょうか?
履歴がないのでどこも採ってくれないんですけど…。
WindowsXP SP2 VC++6.0で動くプログラムの 共有メモリについて質問があります。 複数プロセス間で参照する共有メモリとして、 メモリマップドファイルを検討しているのですが 以下の認識であっていますでしょうか ・mallocで動的に確保する場合に(3M確保を想定)発生する O/Sのページング作業がありませんか? (連続した物理メモリを取る為に、メモリの入れ替え作業が 必要になりファイルにメモリの内容を書いたりする事全般) ・メモリマップドファイルの確保、読み書きは普通のファイル より高速らしいですが、普通のメモリ確保とどう違いますか? ・メモリマップドファイルを確保したプロセスが解放せず死亡 した場合にファイルに書く事はできますか? ・そもそも、メモリを確保する際ページング作業をしない保障はWIndowsではできないのでしょうか?そうだとしたら、ディスクをFlashMemory等のRAMディスクにした場合高速にできますか? 当方、組み込み系システムの詳細設計レベルしかやったことがなく、 共同作業している設計者がダウンした為、初めてWINDOWSで基本設計 しています。 時間的要件があるので、処理時間が特定できないのはマズいのですが・・
Windowsのメモリマップドファイルでのメモリ共有って、 そもそもページングファイル(スワップ)使うんじゃなかったっけ? RAMディスク上のファイル使うか、VirtualAllocExあたり使うかか? WinXPってRTOSじゃないし重いしで、組み込みのレベルで処理時間特定出来るか微妙な気がするけど。 書いてて思ったんだが、C言語の話でもないし、 Win32APIスレとかの方がちゃんとした回答返って来るんでない?
UNIXのTCP通信について質問させてください。 サーバと接続済みのクライアントがソケットを閉じる前に 一方的に接続を切った場合、サーバプログラムがかって に終了してしまいます。 クライアントが一方的に切断した場合でもサーバプログ ラムが動きつづけるようにするにはどうすればよいでしょ うか?
>>294 >・mallocで動的に確保する場合に(3M確保を想定)発生する
> O/Sのページング作業がありませんか?
ページングが発生する可能性はある
発生させたくなければ、あらかじめ確保しておけばいいんでないか
>・メモリマップドファイルの確保、読み書きは普通のファイル
> より高速らしいですが、普通のメモリ確保とどう違いますか?
メモリマップドファイルに書いた内容は最終的に必ずファイルに出力される
普通のメモリ確保は物理メモリが不足してない限りページングファイルに書き出されない
>・メモリマップドファイルを確保したプロセスが解放せず死亡
> した場合にファイルに書く事はできますか?
誰が書くのん?
ファイルは残ったままなので、別の誰かが続きを書くことはできる
>・そもそも、メモリを確保する際ページング作業をしない保障はWIndowsではできないのでしょうか?
マイコンピュータのプロパティの詳細設定のパフォーマンスの設定の詳細設定の仮想メモリで
ページングファイルを「なし」にすればいいんじゃない?
exeイメージやメモリマップドファイルのページングは無理だけど
>時間的要件があるので、処理時間が特定できないのはマズいのですが・・
例えばページングが起きないとしても、そのメモリがCPUのキャッシュに載ってるか載ってないかでアクセス時間は大幅に変わる
if文みたいな条件分岐も、CPUの分岐予測がヒットするかしないかで処理時間が変動する
処理の実行中に他のプロセス・スレッドにCPUを奪われることもあるし
かなり難しいと思うけどな
Windowsで処理時間の特定は無理かと。 CPU、メモリ、チップセット、VGA、HDD…処理速度が変る要因が多すぎる。 仮にそれを統一したとしても、いつLANからパケット飛んできて割り込み入るか なんて分からないし、誰かが机にぶつかってマウスがちょこっと動いただけでも 処理時間が変る可能性がある。ドライバのバージョンが違っただけでも、システム 全体の処理が変わってくる。 x86 CPUの動作は複雑だし、上のレスにもあるように if 文一つ入るだけで 必要クロックが変わる(バイトコード上は同じであるにも関わらず)。 全てがキャッシュヒットかつ分岐予測が当たった場合のベストケースと、 全てがキャッシュミスかつ分岐予測が外れた場合のワーストケース、くらいなら 頑張れば出せるかもしれない。ただしキャッシュミスした時に、メモリからロード するのに何クロックかかるかは、チップセットやメモリ次第。 ある特定のプロセスが、プロセス切り替えのコストを除いて純粋に実行されている 時間(クロック)ならある程度絞れるだろうけど、例外が発生しうる可能性は十分に あるし、完全じゃないね。
あとC言語スレだからC言語で書いた場合を想定するけど、分岐予測や キャッシュヒット、パーシャルレジスタストール(だっけ?)を考慮・制御 するのは、C言語じゃ無理だと思う。
標準入力から入力した数字を一桁ずつ配列に格納したいのですが、どうすればいいでしょうか? 123 を arr[0] = 1 arr[1] = 2 arr[3] = 3 のように格納したいのです。
301 :
300 :2007/12/06(木) 14:34:09
>>300 arr[3] = 3 は arr[2] = 3 の間違いです。
int arr[3]; scanf("%1d%1d%1d", &arr[0], &arr[1], &arr[2]);
スレ違い というか板違い
305 :
300 :2007/12/06(木) 15:00:47
>>296 クライアントが一方的に切断した場合でもサーバプログ
ラムが動きつづけるようにすれば良い。
>>296 SIGHUPとかSIGPIPEとかかな?
>>303 rubyだが
file = File.open('c:\test.txt','r')
buf = ""
while tmp = file.read(2)
buf += (tmp.hex ^ 0xd7).chr
end
print buf
これでどうかな?
元に戻すのは正直わからん
>>308 (a xor b) xor b を求めてごらん。
>>296 * read(), write()のエラーハンドリングを正しく行う
* SIGPIPEがsocket通信というコンテキストで、いつ発生するのか調べる
* SIGPIPEのシグナルハンドラを設定し、適切な処理を行う
SIGHUPって発生したっけ?
>>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)
312 :
303 :2007/12/06(木) 15:24:03
ありがとうございます! あのC++でお願いできませんか? だれかー><
313 :
デフォルトの名無しさん :2007/12/06(木) 16:15:35
C言語スレなのにRubywwwwwwww
#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 とでてきます。 全部意味がわかりません。コンパイラがぶっこわれているのでしょうか? 誰か教えてください!
↑訂正 ”三個ともa”です。すみません・・・orz
誤植じゃね?
可能性1:本が間違っている。 可能性2:目の錯覚。本当は2番目と3番目の printf は b と c。
私もおそらく本側のミスだとおもいます。 しかしエラーについては少しわかりかねます。 打ち間違えはないものとしてお願いします。
タイトルと誤植でググったら、誤植や脱字が多いって評価見っけたから、そこもそうなんだろ。 初心者向けの本での誤植って最悪だな。
a-50; → a=50; printf("変数 b の値は %d\n",a); → printf("変数 b の値は %d\n",b); printf("変数 c の値は %d\n",a); → printf("変数 c の値は %d\n",c); に直してみて
C言語で小数点第六位以降まで扱う方法はありませんか?
float x = 0.0000000001; printf("%.10f", x); こうか?
>>322 足し算やら掛け算やら演算をさせて表示させたいんですが
できませんか?
>>320 ありがとうございました。問題は解決しました。
単純なミスで重々すみませんorz
初心者にありがちなことでめんどくさがらずに教えてくださったみなさまに感謝です。
>>323 やってもみないで訊いてるだろ
float x = 0.0000000001;
float y = 0.0000000002;
printf("%.10f", x + y);
>>325 いえ、今やっているんですが
なぜか自分のプログラムだと少数点6位までしか表示されなくて・・・
>>325 %.10にしたらできました
ありがとうございました
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){
ミスりました。 続き double a(double x){ return x; } これを、これは間違っていると思いますが、 void p(double *a(double)){ printf("%f\n", a(10)); } のように関数を引数にして他の関数に渡したいのです。 とてもくだらない話かも知れませんが、どうすればいいのか分からないので教えてください。
330 :
デフォルトの名無しさん :2007/12/06(木) 23:50:12
>>329 「関数を引数にして」の意味がわからない。
関数へのポインタを渡したいのか、関数の戻り値を渡したいのか、どっちだ?
もっと言うと、何をしたい?
void p(double *a(double)){ printf("%f\n", a(10)); } これだと、double* までが戻り値の型になるから void p(double (*a)(double)){ printf("%f\n", a(10)); } だっけ?
#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 出来ました!!! あじゅじゅしたー
いや上記のは戻り値なし だからvoid
334 :
デフォルトの名無しさん :2007/12/07(金) 00:42:51
セレロンか、BCCか分からないけど、float型の演算ってゼロ除算でないのに落ちることがあるね doubleでは落ちないのに 多分ある程度より小さい数を扱うと0では無いのに0とされてしまう現象があるとおもう
>>334 その通りでございます
プログラムは物理的な存在と意識できる瞬間だな
fopenで新規作成されたファイルを消すにはどうすればよいのですか? 関数を探してみたのですが、見つけられなかったので教えてください
>>336 remove
ただし、誰か(自分自身も含む)がアクセスしていると消えない
338 :
デフォルトの名無しさん :2007/12/07(金) 00:56:14
あと、floatのエラーは、場所が特定されない・・・ 同じ計算なのに、毎回違うところで止まる
>>338 サンプル頼む。
>>336 remove()で消えることになっているけれど、実際の動作は環境依存。
Unixだと、>337のようには振る舞わない。
341 :
デフォルトの名無しさん :2007/12/07(金) 15:17:34
文字列としての数字 例えば 123456789 の各桁の数字を順に配列に入れるのってどうするんですか? 例 num[0]=1 num[1]=2
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 さん ありがとうございます!!早速やってみます
>341と等価にするなら、num[0] = str[0] - '0';だな。 つーか、せめてループにしろよw
345 :
デフォルトの名無しさん :2007/12/07(金) 15:45:14
>>341 です またすいません
続きですがscanfで文字列を受け取り、それを各桁を配列に入れようと思うのですが、ループの終了条件が解りません。
文字列の終端は '\0'
347 :
デフォルトの名無しさん :2007/12/07(金) 15:51:17
348 :
デフォルトの名無しさん :2007/12/07(金) 16:17:37
>>341 です
for (i=0;str[i]!='\0';i++)
num[i]=atoi(&str[i]);
で str[6]を見たところ7が欲しいのに789が返って来ます どうすればいいですか?
>>348 (その目的で)atoi()しちゃいけません。
いずれ各桁について演算をしたいので数データにしたのですが…まずかったのですか…
>>348 num[i]=str[i] - '0';
scanf に 123456789 を入力されたと仮定 sizeof() で配列の長さを調べる for で回す num[0]~[8] までを printf で表示してみる num[6] なら 7 が来ると予想される str[6] だから 7 から終端までが表示される 別におかしいところは見当たらない
と思ったらatoiか
>>348 です すいません 見たのは strでなくnumでした
それで num[5] を見たら 6789 が来る
>>354 教訓。やりたいことを書かないから
・からかわれる
・おちょくられる
・教えたがりに間違いを教わる
羽目になる。
はい
358 :
デフォルトの名無しさん :2007/12/07(金) 16:55:17
やりたいのは、まずは数百桁とかの四則演算等です
>>358 数百桁の計算ならGMPライブラリ使えばいいんじゃないの?
361 :
デフォルトの名無しさん :2007/12/07(金) 18:36:33
ひょっとしたら文字列でもひとつの変数に沢山入力するとオーバーフローしますか?
double型でおk 1797693134862315708145274237317043567980705675258449965989174768031572607800 2853876058955863276687817154045895351438246423432132688946418276846754670353 7516986049910576551282076245490090389328944075868508455133942304583236903222 948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
>>362 有効桁数という言葉をご存知でしょうか?
こういう香具師がいるから%fより%gを勧めたくなるんだよな。
質問いいですか? とある本には main←関数の名前 すなわち関数であるみたいなことがかかれており とあるHPには ↓のようなものがが関数の構造であると書かれておりました int main(void) {return 0;} 関数というのは実際どのことをいうのでしょうか?
>>365 別にその2つに矛盾は無いと思うが。
普通「関数」という場合、名前も含めたものを指す(
>>365 の後者)
「関数の構造」のうち、「関数の名前」が「main」。
Cに無名関数はないから、関数の名前≒関数と言えなくもない。
戻り値
↓ ↓
int main(void)
↑
関数名
367 :
366 :2007/12/07(金) 20:32:09
変なとこで書き込んでしまった。 面倒なので… 左から順に戻り値(int)、関数名(main)、引数(void)、関数本体({ return 0; }) みたいな感じかね。
>>366 ありがとうございました。
もうひとつ質問いいですか?
たとえば
int main(void) {return 0;}
をビルドするときデバッグなしでビルドにしないとちゃんと起動しません・・・
なぜだか教えてください
>>368 そんな質問の仕方で答えが返ってくると思う?
どーせ起動してそっこう終了してるんだろ getchar なり system("pause") なり色々ぐぐってみれば
さっきもこんなようなのがいたな
スレチかもしれないが、Perlのpack/unpackみたいなことをするには関数を自作するしかない?
アラインメントに充分注意したうえで、構造体をchar*とかvoid*にキャスト するのではいけないのかね?
>>370 一文字入力を行うための関数がgetchar()らしいのですが
文字を入力できるようにするためにすぐ終了しないということですか??
これはすごい天然
>>375 すいません
ではどういうことか教えていただけませんか?
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桁だと取り込まれますよね?
取り込んだ後に捨てればいいじゃん
VC2005なんですが、暗号化のライブラリはありますか?md5とかshaとか。 できれば使い方が載っているサイトとか教えてもらえるとありがたいんですが。
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"と格納する。
union
あ、リトルエンディアンだと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 すみません。変数アドレスでもポインタを使って配列のように扱えるようですが?
htonl( *(u_long*)char_array ); ってのはどうだろ。
>>387 もちろん
ただし配列はない場合は、ポインタをインクリメントするとどこを指すかわからない
>>388 今時エンディアン気にする必要がある環境だと、
htonlあるかどうか、微妙なんじゃない?
constへのキャストってどういう時に使うんでしょうか?
よく訓練された初心者地獄だぜフウハハハ
>>378 取り込んだ後の桁数判定がどうにも思いつかないんで、ヒントでもいいので教えてもらえませんか?
とりあえず別の方法を考えついたんですが
1 : まず数値を文字列として取り込む
2 : strlenで長さを判定
3 : 一致したら改めてsscanfでその文字列を数値に変換して格納
なんだか思いっきり無駄なような気がしてなりません…
394 :
デフォルトの名無しさん :2007/12/09(日) 00:22:11
>>393 3はsscanfじゃなくてsprintfだな、きっと。
最初は無駄でもいい。
効率より動くことが優先。
正しく動いたら、その後で効率を考えるんだ。
遅くても、動かないコードの無限大まし。
動かないコードは何の役にも立たない。
>>393 sscanf()にかけるまえに、文字列がフォーマットどおりか確認すれば?
3行程度でしょ。
>>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型に変わるということ???
変数の型は変わらない。その定数の型を指定するだけ。 例えば 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
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」になるんでしょうか?
> 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を使っていたので
同じ理由で一回しかできなかったようです。
ありがとうございました。
408 :
デフォルトの名無しさん :2007/12/09(日) 16:22:57
>>407 なるほど・・ありがとうございます。
「具体的な型を表現することがあります。」
と書いてあるのは、「(末尾にアルファベットをつけた時だけ)具体的な型に一時的に変換できます」
ってことですね。「ことがあります」ってことは、できないこともあるんでしょうか?
409 :
デフォルトの名無しさん :2007/12/09(日) 16:50:05
i++ と、 ++i はどう違うんですか?
>>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
一緒 自分の好みで書くがよろし どっちかと言うと、i++を使う人の方が多いかな
書いた後に
>>410 みたいなパターンがあったる事に気付いた…
単純に値を増やす場合はどっちでもいいけど、
別の変数に代入する場合は、
>>410 みたいに先加算と後加算というふうに使い分けできるよ
414 :
デフォルトの名無しさん :2007/12/09(日) 17:10:47
よくは分かりませんが、 =より+の方が優先順位が低いから、 n = i++; の場合、先にiがnに代入されてしまって、その後iが+1される、 と考えていいんでしょうか・・・
typedef long int time_t; というのはどういう意味ですか?
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++);
は同じになるんですかね?
>>408 「ことがあります」ってのは、必要に応じてプログラマがそのように書くことがありますってことだよ
>>415 long int 型に time_t という新しい名前をつける。
long int x;
と書くところを、
time_t x;
と書くことが出来るようになる。
420 :
デフォルトの名無しさん :2007/12/09(日) 17:47:27
>>418 !!
主語はプログラマーだったのか!!
分かりにくい・・・「〜と書くと、〜という意味としてコンパイラに判断されます」
みたいな初心者向けの説明がよかったにょ・・・orz
ともあれ、大変助かりました。ありがとうございました。
>>419 なるほど。
time_t が新たな型の名前になるんですね。
「time_t」が「log int」の別名として使える有効範囲は、
typedef long int time_t;
の表記のあるファイル内と考えてよいでしょうか?
422 :
デフォルトの名無しさん :2007/12/09(日) 17:54:37
errno_t nErr = 0; ってどういう意味ですか? すんごいたくさん見かけるんですが、どこかで#defineされてる様子もなく・・・
>>420 ローカル変数みたいに、関数の中に typedef があれば、その関数内に限る
グローバル変数みたいに外にあれば、ファイル全体
>>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 の評価結果は異なるが、それをどこにも代入しないのでその違いに意味はない。副作用だけを利用する例。
428 :
デフォルトの名無しさん :2007/12/09(日) 18:37:55
>>424 ありがとうございます。。
ですが、errnoって何でしょう?いろいろググったんですが、
どうにもよく分からず・・・
>>428 open()とか低水準関数を使ってエラーになったときに、エラーの種類がセットされる変数
430 :
デフォルトの名無しさん :2007/12/09(日) 18:55:36
UNIX系のC言語ではテキストモードとバイナリモードの区別がないと書いてあるんですが、 そうすると、バイナリで書き込みたい場合、UNIXCではどうするんでしょうか?(スレ違いでしたらすみません)
バイナリモードで書き込めば良い
>>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だと全部読まれてしまう??
>>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
>>433 たとえば、アスキーコードで「1」は0x31だから、バイナリモードでも、テキストモードでも、
数値の0x31を書き込んで、テキストエディタで開くと「1」が表示される。
数値の0x1とか0xffとかは通常の表示できる文字コードじゃないから、それを書き込んで、エディタで
開いても、読める文字は表示されない。
>>436 errno_t というのはC99になってから、新しく導入された型っぽいね。
strcpy_s()とか、安全な関数のリターン値の型になってた。
>>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だと、どうするんでしょう?
fp = fopen(".dat", "wb"); fprintf(fp, "今日の日付:12月9日"); fclose(fp);
ファイルが終了するまで繰り返す場合 繰り返しの条件式はどうすればいいのでしょうか?
ファイルを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 をつけることは変わらないんですね。それで、区別させるということですね。
納得しました。ありがとうございました。
>>444 >errno_t はつまり、int だと思っていいんでしょうか?
わざわざ新しい名前を導入してまで本来の型を隠してるんだから、errno_t 型は errno_t 型だと思っておくべき。
将来のバージョンで long に変わるかもしれんし (ないだろうけど)。
実行ファイルの上にD&Dしたファイルを開こうと fp = fopen("argv[1]", "r") としたのですが、これでは開けませんでした どのようにすればいいのでしょうか
× fp = fopen("argv[1]", "r") ○ fp = fopen(argv[1], "r")
>>447 fp = fopen(argv[1], "r");
452 :
デフォルトの名無しさん :2007/12/09(日) 20:55:28
#define NUM (100) という例題があるんですが、何故( )をつけるんでしょうか? #define errno (*_errno()) で、*_errno() を囲ってる ( ) と同じ意味でしょうか?
100NUM ⇒ 100100 100NUM ⇒ 100(100)
>>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
>>455 >#define TRUE !FALSE
おそらく別の所でFALSEがdefineされてる
(きっと#define FALSE 0)
!演算子は知っているよね?
FALSEの論理反転をTRUEと定義している
べつに #define TRUE 1 #define FALSE 0 でいいけどな。
ちょっと今気になったことがあったのでいいですか?? #include<stdio.h>はprintf関数を使えるようにする命令なのに VC++で#include<stdlio.h>を抜いても ちゃんと文が表示されるのです。 #includeの意味っていったい・・・
#include<stdlio.h> なんてありません
スペルミスです stdio.hですね・・・
>>458 afxなんとかとかってインクルードしてるとか?
Cとしてコンパイルしてたら、プロトタイプなしでもコンパイルはできるね。
>>461 afxなんとかってなんですか??
Cとしてコンパイルしてましたが・・・
プロトタイプなしってどういうことですか??
ちなみに文は
#include<stdio.h>
int main(void)
{
printf("aaaa");
return 0;
}
の練習文でやったのですが・・
>>462 プロトタイプってのは、関数のリターン値とか引数の型が定義されてる文で、
stdio.h の中で、標準入出力の関係のプロトタイプが書かれてるから、
プログラム中で、引数やら間違えると、エラーになるって仕組み。
C++はプロトタイプがないとエラーになるけど、Cはなくてもコンパイルと実行ができる。
(そのかわり、引数の型やら数を間違えてると、実行時落ちる)
ちなみに、そのコードは、なにを参考にして書いたの?
>>463 ということは書いといたほうがいいわけですね
ちなみに引数はさっきの文でいうと(void)ってことですかね??
えーと
HPです
>>464 main()の引数はvoidだね。
ptintf()は違う。
> #include<stdio.h>
最近、こういう書き方のコードをちょくちょく見るんで、どっかで広めてるやつがいるのかなと思って訊いた。
>>464 書いといたほうがいい。
なお、
#include
は、「ファイルxxxの中身を、ここに取り込む」という意味。
それをプリプロセッサが解釈して、ファイルの中身を展開する。
コンパイラにプリプロセス処理をするだけのオプションがあるだろうから、
それでプリプロセス処理したファイルを吐き出させてみるとよくわかるよ。
>464 HP-UXと申すか。
お前ら初心者を混乱さすなよw
すまん誤爆
>>465-466 とりあえずつけといて問題ないってことですね
プリプロセス処理って文字の調整??みたいな感じじゃなかったですか?
なにおまいら難しい話を入門者に叩きつけてんだよ プリプロセッサだのプロトタイプだのそんなの分かるわけないだろ
>>458 >>462 そのコードの#include <stdio.h>をコメントアウトしたら
warning C4013: 'printf' undefined; assuming extern returning int
の警告が出力されたので、プログラムが完成していないように見えるけど?
>>472 warningは「"printf"の宣言が無いから、とりあえずintを返す関数と思っておくよ」と言っている。
printfの戻り値(intだけど)を何も使ってないので、動作に影響は出ないはず。
なあ、もしかして、プロトタイプ宣言さえ書かなければ、 別の翻訳単位にある関数を引数の数めちゃくちゃとかで呼べたりするのか?
>>474 呼べると思うが、まともに動かないと思われ。
大昔のCプログラムは main() { char *malloc(); int *p = (int *)malloc(size); ... } なんて書かれ方をしていた。 で、これが通るように考慮されて規格が定められた。
477 :
デフォルトの名無しさん :2007/12/10(月) 18:40:45
主にコード修正のコーディングの仕事が回されそうなんですが、 なんか良さそうなバイブル本みたいな本無いですか?
>>476 それやったらローカルでプロトタイプ宣言されるのかと思ったら、グローバルで宣言されてるのな(bcc)
char c = 0xaa; printf("c = %x",c); とするとc = ffffffaaと表示されるのをc = aaとするにはどうすればいいのですか?
>>479 printf("c = %x",(unsigned char)c);
481 :
デフォルトの名無しさん :2007/12/10(月) 23:23:23
>>456-457 レス遅れまくってすみません。ありがとうございました。
>#define TRUE !FALSE
の ! だけは、「でなければ」という意味の演算子としての役割なんですね。
ちなみに、「!FALSE」という名前を、「TRUE」の別名として定義したい
場合にはどうすればいいのでしょう?(演算子と文字列の区別のつけ方として・・)
>>480 printf("c = %hhx", c); // C99
>>480 可変個引数関数では既定の実引数拡張の規則にしたがって、
unsigned charはintに昇格されるから、そのキャストは意味がない。
>>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とか使ってます。
超初心者は金で大学の人を雇ってやってもらうのが一番いいよ
独習Cでも買えばいいんじゃないの
あ、無料で欲しいのか じゃあ、少しは苦労しろ
491 :
486 :2007/12/11(火) 02:20:07
レス下さった方々、ありがとうございます。
>>488 見てみたんですが、どれを落とせばいいのか分からないです・・・。
無料でできるのはどれか教えていただけませんか?
そもそも、C言語始めるのに必要なものって何なんですか?
コンパイラとか良く分からないんですけど・・・。
まず英語の勉強から頑張れば?
>>491 そういうことを学ぶために学校行ってるんじゃねーの?
大抵クラスに詳しい奴の一人や二人は必ずと言っていいほどいるから
そういう奴と友人になるチャンスに恵まれてるのも学校のいいところ
494 :
デフォルトの名無しさん :2007/12/11(火) 02:38:07
文字型配列の中の数値のみを整数型に変換したいのですがatoiを使ってできるんでしょうか? 配列内には文字として数値の他に演算子も文字として定義されているのですが・・。 演算子はifを使って処理はできているのですが数値変換だけうまくいかないものでお聞きしたいです。
>>494 atoiは、数字以外の文字に出会ったらそこで呼び出し元に戻る。
そこをうまく使えば可能。
>>484 見たままとしか・・・。
charの配列からそれぞれ下位4ビットを取り出して並べてる。
上手く言えないなぁ。
((0x31 << 4) & 0x00f0) | (0xfa & 0x000f);
=> 0x1a
>>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に入っておらず、ループの条件は正常でした。 なぜ下では代入されないのでしょう?
(ch=fgetc(fp)) != '@'; ch=fgetc(fp) != '@'; ch=(fgetc(fp) != '@');
>>499 演算子には優先順位というものがあって、
==は=よりも優先順位が高い
for (; ch=fgetc(fp) != '@'; total++)
は
for (; ch= (fgetc(fp) != '@'); total++)
と解釈される。
代入演算子(=)は右辺の値を返すので条件としては正常
演算子の優先順位を全て覚える必要は無いが、
代入演算子はほぼ全ての演算子より優先順位が低い、ということくらいは覚えておいた方がいい
>>500-
>>501 素早い返答ありがとうございます
よく分かりました!
助けてください.下記のようにはできないのでしょうか? わけわからなくなっています. struct A{ double (*f[100])(double); (double *)(*funk)(double); }; void function(){ struct A hoge; hoge->funk=hoge->f[0]; return; }
間違いました.こうでした. struct A{ double (*f[100])(double); (double *)(*funk)(double); }; void function(struct A *hoge; ){ hoge->funk=hoge->f[0]; return; }
>>504 funkの指すものを関数のポインタ配列fの先頭アドレスにしたいのです.
構造体の宣言から間違っているでしょうか?
間違ってます。
>>508 今,構造体の宣言のなかで
(double *)(*funk)(double); ではなく
double (**funk)(double);にして
関数内で
math->funk=math->f;
としたらコンパイル通りました.
正直理屈がわかりません.ただ,ヒントをありがとうございます.
考えて見ます.
(double *)(*)(double) 戻値型がdouble*で引数が(double)の関数へのポインタ double(**)(double) 戻値型がdoubleで引数が(double)の関数へのポインタへのポインタ double (*[100])(double) 戻値型がdoubleで引数が(double)の関数へのポインタの配列[100]
>>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() { }
(int (*)(const void *a, const void *b)) get_hoge()
typedefした方がスッキリ
typedef int (*PFNFUNC)(const void *, const void *);
PFNFUNC get_hoge() { }
仕組みの勉強としては
>>513 の方が明確だけどね
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は実行されません。) 別プログラムを呼び出して、また元プログラムに戻る方法があったら教えてください。
質問です f(x)=ax^4+bx^3+cx^2+dx+e としたとき f(f(x)) の展開式を求めたいのですが 都合の良いコマンドはないでしょうか? ちなみにa〜eは数値でも可(但し1以外で全部バラバラ)です powも考えたのですが、xには値を入れたくないので無理でした
標準ではないな ググるか作れ
520 :
デフォルトの名無しさん :2007/12/11(火) 16:46:41
>>517 ぐぐって調べてみたら、fork()はUNIX専用のようです。
コンパイラがWindowsでのbcc32なので、この関数自体実装されていないようで。
これに代わる方法ありませんか?
522 :
デフォルトの名無しさん :2007/12/11(火) 16:58:08
524 :
デフォルトの名無しさん :2007/12/11(火) 17:28:08
>>522 ありがとうございます!
system()を使ったらあっさり解決できました!
525 :
デフォルトの名無しさん :2007/12/11(火) 20:10:05
今、二分木構造を勉強してるんですけど 関数の中身がなんなのかいまいちよく分かりません。 どなたか、木構造で主に必要な関数 にどんなものがあるか教えてもらえませんか?
526 :
デフォルトの名無しさん :2007/12/11(火) 21:00:21
>>497 その「見たまま」をもう少し日本語で!
ビット演算子とかよく分かりません。これは何をしてる処理なんでしょうか?
その前に2進数、10進数、16進数は分かるのか?
>>526 それはビット演算子が「分からない」んじゃなくて
ビット演算子を「知らない」だけじゃないのか?
もしそうならぐぐれ
529 :
七誌 :2007/12/11(火) 22:12:38
画像の任意(指定)してその部分だけを出力するにはどうしたらいいですか?
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だったらきれいに表示されるのに… ファイルの操作難しいっすね
そうですね
>>531 printfでもfprintfでもちゃんと表示されたけど?ただ、 z の個数があってないみたいだが。
つか、マジックナンバーはやめようぜ。65は'A'にすべき。
>z の個数 count[25]が原因か
いつのまにかアルファベットは25文字になったのか
>>535 0-25だから26回回ってると思うよ^^;
いままでBASICやってたやつだな。
C言語始めて1ヶ月の超初心者なんですが、学校で勤怠計算のプログラムを作るよう言われました。 勤怠表をcsvファイルで作り、ファイル入出力で 社員番号 氏名 基本給 手当 通勤費 日数 残業代 総労働時間 総合計金額 を読み込み?基本給と手当と通勤費と日数と残業代と総労働時間から 総合計金額を出すプログラムを作りたいのですが、総合計金額を出す条件式が分かりません。 残業代は基本給の1.35/160(月のトータルの基本時間)で計算するのは分かっているのですが どうやって条件式を書いたらいいのか分かりません・・・。 先生に聞いてもヒントをくれるだけで、そのヒントも分かってる人前提で話しているので 意味が分かりません。 どなたか教えて下さい。よろしくお願いします。 ちなみに使ってる環境はwindows XP コンパイラはgccです。
通勤費は全額出してくれるのかね まあ普通の会社だな
ちゃんと残業代出してくれるんだね いい会社だな。
二重帳簿かもしれないな もう一つの帳簿のデータが無いと完璧とはいえない
残業代のでない会社だって、支給項目自体はあるだろ
残業単価=基本給*1.35/160; 総合計金額=基本給+手当て+通勤費+残業単価*(総労働時間-160);
545 :
539 :2007/12/12(水) 20:36:52
ありがとうございます。 これはif文で書けばいいのでしょうか? ちなみに10人分の総合計金額を出さなくてはいけないのですが 10人目までwhile文で繰り返してbreakでいいのでしょうか・・。 分からないループに入って頭真っ白です。
539を教育する費用も大変なものだと思った
>>545 csvに10人分入ってるなら、EOFまで読めば?
548 :
デフォルトの名無しさん :2007/12/12(水) 22:01:45
C言語で組んだコンソールプログラム内で、 Excelファイルのデータを読み込む方法ってありますか?(csvではなく、xls) ぐぐってみると、VC++などで読み込む方法はいくつか解説されているのですが、 その他の環境でそれをすることは可能でしょうか? VC++のほうの解説だと、Office2000やXPがインストールされた環境でのみ動作するようですが・・・ 使用しているコンパイラはBorlandのbcc32です
>>548 特殊なライブラリーがなければダメでしょ
ExecelファイルをCSV出力してそれをよめば?
COM呼び出せばいいよ
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圧縮したもの。やるならあと頑張れ。道なき道を覚悟しろ。
構造化ストレージは素直にJava使ってPOI経由で アクセスしたほうがいいんじゃまいか。スレ違うけど。 ODBC-Excelドライバ経由で叩く手もあるよね。癖があるけど。 OOXMLならまだ触りやすい気もするかな、かな。
>>539 が新米教師で「そんなもんCじゃなくてエクセル上でやればいいじゃないか」
と勘違いしたのは俺だけでいい。
>553が何を言わんとしているのか理解できないのは私だけでいい。
こんにちは。突然ですが、 C言語でスレッドプログラミングの勉強をするのにいい本ってありませんか? どなたか知っている方いたら教えてください。
google
Sleep関数を使ってウェイト処理をしようと思っているんですが、 Sleep();の値にはint型の数値しか取り扱えないのでしょうか? また、マイクロ秒単位でのウェイト処理をする方法はないでしょうか?
そもそもSleepはそんなに精度のよいものじゃない。 だいたい10msが限界 CPUのタイムスタンプカウンタでも使って、 ビジーループすればいいんじゃないかね。
560 :
デフォルトの名無しさん :2007/12/13(木) 15:49:17
すみません。 HTMLから全てのURLを抽出するにはどうすればいいですか?
562 :
デフォルトの名無しさん :2007/12/13(木) 15:59:42
tp://から空白や"までを取得すれば良い
2秒早かったが
>>562 の方が的確でFTPもおkと言ってきたか
フフぬかったわ
相対URLはどうすればいいですか?
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が判らないと無理
>>566 たとえば、mailto:には//ありませんよね
569 :
デフォルトの名無しさん :2007/12/13(木) 16:12:29
判定ルーチンをひとつひとつ追加していけばよい 簡単にはできない イメージタグとか、リンクタグとか、Java スクリプトとか、PHPとか色々あるから全て抽出するには全部の判定を入れる あと曖昧な記述にも対応しなければ行けない
というふうに結構面倒な処理なので、文字列検索でサボろうとしないで マトモな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のタグなどは出来ない
C++のコード貼ったりしてるけど、このスレが何かお忘れじゃありませんか?
URL抽出の参考になりそうなサイトがあれば、紹介してほしいのですが、 よろしいでしょうか?
とりあえずおいらは、TLDの一覧リストを作っておいて、 .[TLDs](/|\s)を探して、前後の文字連中がURIとして 延長可能そうならのばす、って言う感じで処理したことはある。 IDNがマイナーだった時代の話。
577 :
デフォルトの名無しさん :2007/12/13(木) 22:21:40
東京ランドディズニーの一覧?
入力が大きいときの計算時間を予想したいんですが、 計算時間と入力nの関係をグラフにする場合軸は対数ですか?
それはこのスレで聞くことじゃない
どこがいいですか?
すみません。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が悪いのか、何が原因なのか教えて下さい。 頼みます。
>>581 ここはC言語のスレだ。
C言語では「クラス」なぞ宣言出来ない。
他所池他所
つか自分で答え書いてんじゃん。
>Image myImg(_T("kuso01.jpg\0\0"));
で実行されるコードの中に
> lastResult = DllExports::GdipLoadImageFromFile(…
を呼ぶコードがあって、その時点では
>GdiplusStartup(&gdiToken, &gdiSI, NULL);
が実行されてないからだろ。
585 :
デフォルトの名無しさん :2007/12/14(金) 09:19:35
キーボードの入力待ちってどういう命令があるんでしょうか? エンター押さなくて良いやつ教えて下さい
kbhit()とか?
587 :
デフォルトの名無しさん :2007/12/14(金) 10:03:31
サンクス
コンパイルについて質問があります。 ccやgcchのオプションで、-Oや-xOを用いて 最適化レベルを指定するとき、4や5といった高レベルにすると 計算結果が変わったり意図しない動作をすることがあると聞いたのですが、 具体的にはどういった処理で差異がでるのでしょうか? 通常はO2以上っは使わない方がいのでしょうか?
589 :
デフォルトの名無しさん :2007/12/14(金) 10:39:49
インライン展開とかCPUの計算順序とかだろう
>>588 私の知る限り、最適化で値が変わるのは実数演算のみだから余り気にする必要はない。
何故なら、実数演算の場合は完全に値が一致することを前提にプログラムを組む方が稀だから。
ついでに言えば、一致させる必要がある場合はコンパイラとターゲットCPUごとにオプションを微調整する必要があると思った方がいい。
591 :
デフォルトの名無しさん :2007/12/14(金) 11:12:57
スレ違いかもしれませんが C言語の参考書は何を使いましたか?? またオススメの書籍はなんですか??
>>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日ぐらい悩んでます お願いします・・・
>>593 char* str だけだと入れる場所は無いからダメ。
char str[10] だと、関数抜けると無効だからダメ。
malloc等で動的に確保するか、動作確認したいだけなら static にするとか。
>>593 >必要な領域を確保される、長さに上限は無い
もう理解していることだったらすまないが、勝手に確保なぞされない
Cならmalloc、C++ならnewで確保せねばならない
それで今回のケースだが、たとえばchar str[10]みたいにすると、
ローカル変数のスコープは関数内だから関数から抜けた時点でどうなるか分からない
char *strみたいなとこにmallocもせず直接ぶっこんだなら、上に書いたようにNG
mallocせねばならない
ありがとうございます!
>>594 >char str[10] だと、関数抜けると無効だからダメ。
やはりそうですか・・・
そのように宣言してから、
return str; で終了すると、コンパイル時に「問題のあるポインタ変換」といった警告メッセージが出ます。
コンパイルは成功するのですが、main関数側で呼び出すと、不安定になります。(表示されたりされなかったり、文字化けしたり、複数回実行するとエラー出て停止したりと。)
回避策として、return &str[0]; とやると警告メッセは出なくなりますが、不安定なのはいっしょです。
>>595 >勝手に確保なぞされない
ありがとうございます!私が間違って覚えていたようです。
今回使っているstrの宣言を「char* str=(char *)malloc(100);」にして、
さっそく試してみたら、問題なく動作しました。
しかし、今回のようにreturnで返すために格納する変数の場合、
free(str);でメモリ開放することができないのでは?
(return文で使うため、その後に処理を書けない。)
動いてはいるものの、メモリ開放せずに関数を終了してしまうのは問題あるような気がします。
何か方法はありますか?
>>596 その場合、呼んだ関数側で解放すればいい。
>>597 void main(){
printf("%s\n",function());
}
のように呼び出す場合、どうやって開放すれば良いですか?
文字列うんぬん以前に、まずポインタを理解すべきだな。 "char*"を文字列型(JavaのString)みたいに考えてるようだが、それは正確ではない。 char(8bit整数)型のポインタが"char*"なだけで、Cではたまたまそこに文字列を入れる 慣例になってる(コンパイラもそう判断している)ってだけ。 それ以外の扱いはint*やdouble*と変わらん。
void main(){ char* p = function(); printf("%s\n", p); free(p); } こうなるべ。 まあ static char str[10]; でも動くけどな。
>>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];でも動くけどな。
このようにした場合、あとで開放しなくても大丈夫なのですか?
>このようにした場合、あとで開放しなくても大丈夫なのですか? 開放する必要は無い。プログラムの最初から最後まで残ってるけどな。
604 :
デフォルトの名無しさん :2007/12/14(金) 13:10:46
>>603 ということは、何百回もループさせて呼び出すような関数の場合、
あまり良い使い方ではないということですか?
605 :
デフォルトの名無しさん :2007/12/14(金) 13:15:29
総合計1M前後なら無視して良いだろ メモリ食いすぎたら調べればよい
>>604 staticな変数は、その関数を何回呼ぼうと同じ場所の同じものが使われる。
607 :
デフォルトの名無しさん :2007/12/14(金) 13:57:43
1から100までの数をランダムに100回発生させ、その発生した数の(1回毎の)平均値を 示すプログラムを教えてほしいです。 さらに、そのコンパイル結果をコピーできるようなプログラムを教えてほしいです。
宿題スレ行け
609 :
デフォルトの名無しさん :2007/12/14(金) 14:10:18
システムタイムで質問があります。 TimeGetTime()で取得するシステムタイム時間にて 約49日で0クリアされますが、その際にバグがあり、修正を行ったのですが、 すぐに検証する事が出来ません。 システムタイムを任意の値にセットする事は可能でしょうか?
ラッパーかまして、スタブでテストしろ
>>606 ありがとうございます!
これで心置きなく使えます
ありがとうございました。 システムタイムの変更は出来ないという事でおkでしょうか? ラッパー使ったことないので、調べてみたのですが、 支援ソフトつかわないとダメってことでしょうか?
>>613 できないという確信はない。できるかもしれん。
ラッパーというのは、DWORD myTimeGetTime() { return timeGetTime(); } みたいな
関数を作れってこと。
>614 ご親切にありがとうございました。
#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になってしまうのですが、なぜかわかりません。
>>616 cell の添字がマイナスになったらtree壊すべ
>>617 レスありがとうございます。
じゃあ配列でこういう書き方は出来ないってこと?
>>618 そうじゃなくて、マイナスにならないよう、値をちゃんとチェックしろ、ということ。
わかった。 どうもありがとう
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++){ 数値を入力すると強制終了してしまう・・・。 どなたか教えてください・・・。
>>621 > array[i] = NULL;
これは array[i] = 0; だな。
NULLは間違い。
さらに言えば、バッファのクリアもいらない。
自称上級者でも、バッファのクリアしろって言うやついるけど、だまされるな。
>>622 わかりづらい書き方だけど、
arrayはポインタの配列だからNULLであってるだろ。
scanfって最後に'\0'入れたっけ?
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/
>>623 自動的に\0はつけられるよ。
バッファあふれたら別だけど
>>621 は、掲載してるソース以外の場所に原因がありそう。
>>621 エスパーすると、
>char buff[BUFFSZ],*array[BUFFSZ];
char buff[BUFFSZ],array[BUFFSZ][BUFFSZ];
こうすると動く気がする。
629 :
デフォルトの名無しさん :2007/12/15(土) 00:57:14
>>621 arrayに渡すエリアの確保を忘れているとかか?
arrayはポインタの配列だからarrayに色々データを入れるのなら
何処かでmallocでエリアを作らんとだめじゃね?
強化学習ってC言語だとプログラミングむずい?
理論自体が分かってるなら難しくないよ
632 :
デフォルトの名無しさん :2007/12/15(土) 03:05:47
VC++でOpenCV使ってんだけど、 OpenCVのライブラリいじってタイトルバー消すにはどうしたらいい? そもそもライブラリ見ても、タイトルバーの消し方がわからん。 何かいい方法知りませんか。
633 :
デフォルトの名無しさん :2007/12/15(土) 11:32:49
ポインタ氏ね
>>631 強化学習が分かれば
囲碁のプログラミングも出来るかな?
囲碁プログラムに強化学習を使うことも出来るよ
>>636 基本はヒューリスティックの自動構築ですか?
冬休みに10級くらいで打てるソフトを作りたい。
うん
ちなみにおれはアマ5段ほどの棋力があります。 囲碁のソフトを作るのには有利ですか?
必ずしも有利になるとは言えない でも不利になることは無いと思うよ
641 :
632 :2007/12/15(土) 13:09:46
>>640 ゲームプログラミングをしたことありますか?
釣れますか? いいえ、それは釣れません
いやルールを1から知るよりは、予め知ってたほうが効率よくプログラム書けるから不利にはならないだと思うよ。 ボーリングスコア計算を練習で作ってみてって言われてストライクスペアの計算知らなかったから最初は困った。。。
>>642 あるよ
というか専門分野
囲碁じゃないけど
>>645 友達になりませんか?
当方、専門を通信にしようかAIにしようか迷っている
電気電子系の学生です。
相談に乗ってもらえるとありがたしでつ。
Skypeのアカウント名は
sunsunlight_heart
でつ。
連絡待ってます。
(といっても今日は5時まで家に帰ってきませんが)
こんなスレでまさか「友達になりませんか?」のフレーズを見る日がくるとは思わなかった
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 連書すみません。
>>650 if(*cp == ' ' || *cp == '"'){
↓
if(*cp == ' ' || *cp == '"' || *cp=='\0'){
>>649 ×scanf("%s",&buff);
○scanf("%s",buff);
655 :
デフォルトの名無しさん :2007/12/15(土) 15:16:14
>>653-654 ありがとうございます!!正常に稼動しました!!
もっと基礎を勉強する必要があると反省しました・・・。
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); } }
関係ないけど、せっかくdefineしてるならmもそれを使えよ
>>656 環境は?
スタックオーバーフロー起こしてんじゃないのかな。
配列をグローバルにするか、staticつけてごらん。
659 :
デフォルトの名無しさん :2007/12/15(土) 16:44:24
bitset<10000> a; とかつかえ 0と1しか記録しないのに32bit使うのがおかしい
660 :
デフォルトの名無しさん :2007/12/15(土) 16:46:28
while文で無限ループになってんじゃね? printf入れて確認したほうがいいよ。
なぜそこでSTLを勧める。どうみてもC言語だろ
662 :
デフォルトの名無しさん :2007/12/15(土) 16:48:03
int p[10000]とかだろ
663 :
デフォルトの名無しさん :2007/12/15(土) 16:49:33
ビット単位を扱うのが、C言語だと複雑になる為だ 8倍も使うがやむを得ず初心者はcharでもよい
まずスレタイを読め
つか、intの10000 くらいの配列じゃスタックオーバーフローにならんだろ。
いや、LSI-C(試食版)と予想w
なんつうコスパの悪いスレ・・・
>
>>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は駄目すぎ
>>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;
}
未だにLSI C-86なんて化石コンパイラ使ってる奴いるんだ…
金だかやる気のない学校では使ってそうだな
金なくても gcc でいいだろ・・・。
676 :
デフォルトの名無しさん :2007/12/15(土) 17:34:25
vc++やbccで動く物がminGWで動かないのが時々あるのでgccは駄目だな お手軽でよく動くのはbccだ
>>647 お願いです。
いろいろ話を聞かせて欲しいです。
とりあえず10までの素数は自力で出して それ以降は 1の位が1379の時だけ調べれば 10000回のループから 1000回のループに減らせるんじゃないか? 1回のループで4回調べる事になるけど
調べること自体のループのこと考えてないだろ
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という構造体配列の文字列から送ってます。
:が消えてるのは不思議だね
682 :
デフォルトの名無しさん :2007/12/15(土) 19:08:54
それは書き忘れです。
なんで抜粋したところが間違ってるってわかるの?
>>676 それはその動かないプログラムに問題があるとしか・・・
それは最初からファイル名を表示してるからじゃ
data001.txt がカレントディレクトリ内にないに1票。
688 :
デフォルトの名無しさん :2007/12/15(土) 19:21:44
たくさんのプログラムファイルのうちのひとつなので、 みじかくして考えてみます。
"w" で何かファイルを作って、そのファイルが本当に data001.txt のあるディレクトリ内に作られるかどうか確かめたら?
フルパスで指定しろ
そこの関数の後を全部コメント文にして 実行したらまわるけど、コメント文じゃなくしたら 同じことに。文字列の領域オーバーかともおもったけど その関数まで全く同じにしているのde
ソースかと思ったら誤爆かよ
>>695 ガチで悩んでいます。
お願いです。Skypeで連絡をください。
sunsunlight_heart
697 :
デフォルトの名無しさん :2007/12/15(土) 20:29:48
まずは写真をうpしろ。 話はそれからだ。
順序が根本的に間違っている気がするのは漏れだけか? 自分の都合だけで他人が気安く友達になってくれるものなのか?
まずはおっぱいうp
701 :
デフォルトの名無しさん :2007/12/15(土) 20:42:13
「プログラムは上から実行される」と言いますが、正確に言うと、 上から実行されるようなコンパイラの仕様にした、ってことでしょうか?
どうでもいい
顔を右に90度傾ければ左から実行されるではないか
>>695 おれはRubyが書けます。
でもRubyは実用的なソフトの範囲ではとても有用だけど、
アルゴリズムとかを駆使する速度重視のプログラミングでは役に立たないと思います
。
囲碁のソフトを作るにはやはりC++ですか?それともJavaですか?
オブジェクト指向じゃないと嫌です。
C++
>>701 縦書きのエディタがあれば右から実行されるのではないかな。
>>704 ここはCのスレなので他所でやってください。
Cが選択肢に有るならまだ理解できなくも無いが なぜここに来たんだろう
709 :
デフォルトの名無しさん :2007/12/15(土) 21:57:57
main()内の int argc, char *argv[] の意味がわかりません。ググッてみましたが わかりつくした人の解説のようで、オレの ハートには届きません。 どなたかオレにわかるようにできる限り簡単に 説明してもらえませんでしょうか?voidとの 違いとか・・・。
voidがまずなにかをググるんだ
int argc → コマンドライン引数の数(実行ファイル名含む) char *argv[] → コマンドライン引数を区切った文字列配列(実行ファイル名含む) 例: hoge.exe /piyo -uma argc == 3 argv == {"hoge.exe", "/piyo", "-uma"}
>>709 お前のハートに届けてやるぜ!
俺の歌を聞けー!!!
レッツゴー!突ーき抜けようぜ
夢で見た夜明けへ〜
まだまだとおいけっどー
C++って手続き言語なのかオブジェクト指向型言語なのかどっち? Ruby厨のおれとしてはとても不思議
スレ違い 手続き型言語⊃オブジェクト指向言語
>>713 マルチパラダイムって言葉を知らないか。
C++って object.method って記法出来るっけ?
718 :
デフォルトの名無しさん :2007/12/16(日) 00:13:44
>>711 Dev-C++だと問題なくコンパイルできても
ボーランドでコンパするとint argc が使われていないと
エラーがでます。voidにすると正常に。
要するにDos面で分割コンパするときに
bcc32 ファイル名 ファイル名・・・
ってみたいな操作するときに必要?
>>718 合コンでおk
argv を使うなら argc もチェックしたほうがいい
エラーとウォーニングの区別つけろよ
721 :
デフォルトの名無しさん :2007/12/16(日) 00:26:10
>>718-720 すいません。エラーでなく、警告でした。
思い通りの動作をしても警告されるのは気分よくないです。
警告出さないようにするオプションあるだろ
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
724 :
723 :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日目とすることで動きました。
#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 訂正 (すみません)
×知るとすると
○シフトすると
>>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倍になる
10進数で、1桁目に0追加して10倍になるのと同じだな
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" がメモリ上のどこにもなかったらどうなるんでしょう? このプログラムは常に動くとは限らないんでしょうか?
無かったら コンパイルバグ
>>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 コンパイルバグというのは、コンパイルしようとしたら、エラーが出るってことでしょうか?
>>735 基本的にそれはない。
"abcde"はリテラル文字といって、特殊な領域に確保されるようになっている。
ただ、リテラル文字の領域を破壊することは可能。
そのstrに対して、何らかの文字をstrcpyで上書きしてごらん。
この場合は、処理系によって動作がことなる。
ほとんどの場合、coreになるはず。
>>738 コンパイラのバグって意味でしょ
リテラル文字の領域が確保されない、なんてことはない。
実行時にメモリ不足かなんかで"abcde"の領域確保に失敗した場合 プログラムの実行はmainに突入する前にストップするだろ。
あるかな? 実メモリが不足していようが、 仮想メモリに展開されるから、ロードモジュールをメモリ展開するときに落ちるってことはあまりないと思うけど あぁ、でもスワップ領域もお腹いっぱいだとありえるのかな
743 :
デフォルトの名無しさん :2007/12/16(日) 17:23:17
>>735 abcdeは文字列リテラルだ。
文字列リテラルは静的領域に確保される。
Windows、組み込み機器等例えどんな環境だとしても
書き換えが不可能な場所に確保される。
メモリ上に文字列リテラルがないとしたら
OSもしくはハードウェア上で障害が発生している。
"abcde"というデータが壊れている場合、その壊れたデータをchar型として扱う。
その結果、わけのわからない文字が画面に表示される等の現象が発生
"abcde"が存在する場所にアクセスできない場合、メモリアクセスエラーが発生。
暴走、もしくはOSが用意したエラーメッセージを出力
WindowsならEXEをロードするときに領域を確保するので 実行段階で領域不足というのはありえない。 メモリ不足ならロード時にエラー終了。実行はされない。
いや、WinならファイルマッピングでEXEファイルをマッピングするっしょ
747 :
デフォルトの名無しさん :2007/12/16(日) 17:42:12
>742 仮想メモリがない環境もいっぱいあるんだよ。
Cにもインタプリタの実装があってだな
画像処理なんですが、任意に指定してその場所だけを出力するプログラミング教えてください
日本語でおkと言わざるを得ない
フルパスからフォルダまでのパスを得るのかな
画像の一部分の矩形領域を指定して保存したいって事なら OSと処理したい画像のフォーマットくらいは書けや
>>753 menuselectの中、
>fgets(buf,2,stdin);
てやるなら
>char buf[1];
じゃなくてbuf[2]て宣言しろよ
それで隣の領域破壊しているかもしれない
#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へ }
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();
} 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; } レーダーチャート作ろうとしていますが分からないところがいくつかあります。 分かる方いらっしゃいますか?
>>744 >Windows、組み込み機器等例えどんな環境だとしても
>書き換えが不可能な場所に確保される。
大嘘もいいとこだ。
Windowsですらコンパイラによるのに。
レスはえーな。
>>759 下のコードはVC2005だとメモリアクセス違反で止まるけど、
BCC5.5だと標準出力に「best」が表示される。
#include <stdio.h>
#include <string.h>
int main()
{
char *p = "test";
p[0] = 'b';
puts(p);
return 0;
}
/GFを指定しなけりゃ、VC2005でも動くんでないの。
リテラル領域を書き換えたときの挙動は処理系によって違うって最初にいったのに、 人の話聞いてないんだからぁ
763 :
753 :2007/12/16(日) 22:19:13
>>754 buf[2]としたらできましたー。ありがとうございます
>>757 >レーダーチャート作ろうとしていますが分からないところがいくつかあります。
>分かる方いらっしゃいますか?
そんなのエスパーしかいないよ。
まず、何がわからないか、書くんだ。
765 :
デフォルトの名無しさん :2007/12/17(月) 00:00:18
>>739 、
>>744 文字列リテラルについて調べましたが、やはりよくわかりません。
"abcde" というデータは、プログラマが配列に記憶させてはじめて繋がった
文字としてメモリ上に記憶されるのではないのでしょうか?
「文字列リテラルは静的領域に確保される。書き換えが不可能な場所に確保される。」
というのは、プログラマが、"abcde"という文字列を打ち込んだ時に初めて確保される。
という意味とは違う・・・?
>>765 > プログラマが、"abcde"という文字列を打ち込んだ時に初めて確保される。
違う。文字列リテラルとはプログラムがロードされたときに既に確保され、
プログラムが動作しているときには(多分)書き換えられないものだ
(厳密には書き換えても良いが、書き換えた場合、未定義になる)
プログラム上で変更することがある場合は文字列リテラルでは無く
文字列の配列を使うべきだ
また、配列を使う場合は予め最大サイズを確保する必要がある
とりあえず765は、PC上でプログラムがどうやって実行されてるのか勉強した方が良い。
>>765 >「文字列リテラルは静的領域に確保される。書き換えが不可能な場所に確保される。」
ROM上に確保されるので書き換えらんない、と思っとけ。
組込みだと実際にそういうのもあるし。
いろんな公開されているソースコードを読むと 以下のような実装を多々みかけます。 しかし、俺の上の連中はそれは汚くて危険極まりない コードだと言います。私にはどんな危険があるのか 不明なので誰か教えてくれませんか? int func() { 処理 if(err) goto ERR; ERR; ポインタの解放等々 } もしポインタの解放なんかを一ヶ所でまとめて行うなら javaやC#のようなExceptionに相当する部分があっても いいと思うのはやはり馬鹿の考えることなのでしょうか。
>>769 それはいい発想だよ
現にGNUあたりのいくつかのプロダクトではそのようなソースを見かける
もしくは、try,catchをgotoを使ってマクロで実現するってのもあり。
Cにはいわゆるtry〜catch〜finalizeが無いから、そういう使い方をするし、
try,catchよりもオーバーヘッドが少ない
じゃあ何でダメなのかっていうと、gotoを乱用すると処理があっちこっちに飛んで、
可読性の悪いコードになるから。
gotoを扱いきれるなら話は別だけど、チームで仕事してたら、必ずしも理想どおりにはいかない。
gotoを変な風に使う人とか、gotoが多いとソースを正しく読解できない人が出てくるかもしれないからね。
>>769 goto文有害論を盲信してるだけだから、気にするな。
特に危険が無いから実装も多い。
ただ、波風を立てずに会社に居たいなら従っておいたほうがいいだろうな。
従っておいても無害だし。
>javaやC#のようなExceptionに相当する部分があっても
>いいと思うのはやはり馬鹿の考えることなのでしょうか。
CにExceptionに相当する機能が無いから、
C++、Java、C#に実装されたわけで…
>>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;
}
まあ気をつけてコーディングすれば簡単に防げるけど
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; }
>>773 今ひとつ綺麗じゃないが、かといって他にうまいやり方も見つからないんだよな。
こういったエラー処理はいっつも悩む。
普通は int *p = NULL, *q = NULL; とか FILE *fp = NULL; とかにしとくだろ
free(NULL) はiok
ラベルが複数のgotoは読みにくいな #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } みたいなマクロを使った方がまだましかも
いつも↓のように書いてる インデントが多段になってしまうのが欠点だけど・・・そんなの関係n(略 int func() { int *p = malloc(sizeof(int)); if (p) { int *q = malloc(sizeof(int)); if (q) { // 処理 free(q); } free(p); } return 0; }
もう秋田
>>777 >>776 にあるように、free(NULL)やdelete NULLは何もしないことって決められてたハズ。
なので if (p) のチェックは無くてもOKじゃね?
関数呼び出しが行われなくなる分、極わずかに早くなるかもしれんが…x86みたいに
分岐予測ペナルティがシャレにならん処理系だと、大人しく呼び出した方がいいかも。
そういうシリアスな処理中にリソースの開放なんてするなって噂もあるけどな。
Linuxでのプログラミングで質問です。 TCP/IPのソケット通信なんですが、 受信専用プロセス(A)と送信専用プロセス(B)を分けます。 Aでソケットを作り、相手から接続があれば、 それをプロセス間通信でBにソケットを渡します。 その方法はどうやったら良いでしょうか?
今日からC言語始めた初心者です。 色々検索して解らなかったので質問します。 何かキーを押すと進むみたいな関数って無いんでしょうか? .exeをクリックしてコマンドプロンプトが開く時に キーを押すまで窓を開いたままにするのが目的です。 自分と同じ質問してた所ではgetchar();を入れろと書かれてました。 書き方の例等教えてください。お願いします。
>782 sendmsg
>>783 ふざけんな
やる気ないならやめろ
あるなら参考書なりサイトなりを一通り見ろ
>>783 コンソールのプログラムは、普通コマンドプロンプトから実行する。
>>783 #include <stdio.h>
int main(){
getchar()
return 0;
}
>>783 Windows XP や Windows 2000 ならば、スタート→ファイル名を指定して実行、にて"cmd" を入力して OK ボタンをクリックします。
ここで起動するのが、コマンドプロンプト、あるいはコマンドインタープリタと呼ばれるプログラムです。
使用方法については色々調べてみてください。
>>785 わからへんときは、ほんましょうもないこともわからんのや、おまえさんもそんなことあらへんか?
あらへんわ
そらしやわせやな。
いつも不思議に思うんだが、なんでコマンドプロンプトの起動方法を教えるとき、 「ファイル名を指定して実行」から起動する方法を教える人が多いんだろ。 スタート→すべてのプログラム→アクセサリ→コマンドプロンプト いつもこうやって起動してるんだが、少数派なのかな?
単に手順が少なくて済むからってだけでねーの。
>>792 面倒くささを自分のレスで体現してるじゃん
きあいや。きあいやで
普通に「最近使った項目」から起動していますが何か
「クィック起動」バーの方が早いよ
>>792 ショートカットなかったりすると厄介だから
>>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件ずつ拡大のようにできればいいのですが。 何か手段無いですか? 長文すみません
>>800 >801の書いているようにrealloc()を使うのが素直なケースだが、malloc()とfree()だけでも同じことはできるぞ。
# つーか、realloc()の実態はmalloc()+memcpy()+free()みたいなもんだからな。
803 :
800 :2007/12/18(火) 14:51:23
reallocによる拡張はブロックコピーが発生しうるから毎回拡張するのは無駄。 数件、あるいは25〜50%くらい一気に広げたほうがいいかもな。 要素数が確定していない場合は構造体+リンクリストを使うのも定跡。
realloc()を繰り返すくらいなら、生徒1000人としても4〜8KBのオーバーヘッド で済むリスト構造を採用する方がスマートだね。 最近のPCじゃrealloc()のコストなんて誤差なんだろうけど。
つーか、毎回拡張するコードを実直にブロックコピーで実現する実装なんていまどきあるの? それと、初心者にCでリスト構造なんて虐め以外の何者でもないぞ。
807 :
超初心者 :2007/12/18(火) 17:59:41
凄くレベルの低い質問で申し訳ありませんが助けてください(>_<) 足し算のプログラムを作り、数字以外が入力された時は【エラー】と 出力したいのですがさっぱり分かりません。どうすれば出来るか教えて 貰えると物凄く助かります!!
>>807 エラーを表示しない足し算プログラムは作れるのかい?
それは宿題かい?
>>807 宿題なら宿題スレへ、そうでないなら判るところまで作りこんだソースを貼れ。
なんつーか、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; } よろしくお願いします。
>>811 方針としては、scanf()では数字以外を入力することができない為「数字以外が入力された」という状況を作れない。
従って、一旦全て文字列として入力してから数字かどうかを判別することになる。
文字列として入力するにはfgets()、数字かどうかを判別にするにはsscanf()かstrtol()が使える。
まあscanfの戻り値見てエラー出してバッファクリアしてやりなおせば可能だけどな。 でもまあほかのやり方覚えておいたほうがいいな。
814 :
超初心者 :2007/12/18(火) 18:29:30
他のといいますと??
他のってのは
>>812 のレスを踏まえての話だったんだが。
どうせバッファクリアにfgets使うし(fflushでもいいか?)
まずはfgets使ってみては?
816 :
超初心者 :2007/12/18(火) 18:36:04
解りました。 頑張ってみます!!
fflush()で入力バッファがクリアされることは保証されていない。
だから?つけたんだけどな。処理系依存ということで
いや、疑問符がついていたから解説した積もりだったんだが。 # 余計なお世話だったかしら?
こんなん作ってみた。 #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; }
どうせ数値が必要なんだから、strtol()呼んで帰ってきたポインタのポイント先がナル文字かどうかで判断すりゃいいじゃん。
freadで1byte readしたあと、ftellの返却値を見ると数十byteごとに飛ぶんですけど これってシーケンシャルな値は期待できない?
バイナリで開いてないのではとエスパーしてみる。 あるいは,freadの引数が、buffer, 1, 1, fpでは「無い」というオチか?
>>823 vc2003使用、freadはその引数だし戻り値=1も確認した上で飛ぶんだよね
>>822 テキストストリームに対してftellを呼び出した場合の戻り値は処理系定義
fgetpos
>>656 普通に実行してちゃんと終わるが、2乗ごときでpow()を使うのは無駄。
もしかしたら、とんでもなく実数演算が遅くて止まって見えるのかも知れず。
fgetposも同じでした 試しにfreadだけを繰り返し実行してみると途中で戻り値=0になり 見てみると丁度ftellの戻り値が連番から飛ぶポイントでした freadの後にftellするとファイルの最後まで読めるのになぁ。。。
一体何を言っているのか分からない
>806 >つーか、毎回拡張するコードを実直にブロックコピーで実現する実装なんていまどきあるの? とりあえずぱっと見、FreeBSD の libc、VC8 の CRT、Cygwin の libc あたりはさすがに毎回ブロックコピーにはなってない。 どこまで頑張るかはそれぞれ違いそう。
>>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となる
ということです
\rすっとばしてるんじゃないの
しかし、デバッガちゃんと使ってたらそんな書き方にならないと思うのだが、 実行して結果だけで判断してるの?
>>832 ありがとうー。そういう制限があるの知りませんでした。
そして、
>>823 さんのエスパーの意味が今分かりました。ありがとー。
>>833 デバッガは勿論使っていますが、説明なので簡素化しています。
具体的にはどうのような書き方になります?
もしWinなら、 fopen の第2引数で"rb"
fopenでruby
二つの整数値を読み込んで、小さいほうの数以上、大きいほうの数以下の 整数を全て加えた値を表示するプログラムを作りたいのですが↓のように書いたのですが うまくいきません。どこが悪いか教えていただけないでしょうか。 #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); }
とりあえず, a>b(かa<b)になるように,aとbを入れ換えたほうが楽
>>838 どのように「うまくいかない」のか書いたほうがいいと思うが、
・ a と b にちゃんと値が入っているか printf() などで確認
・計算のループ中に printf() などを入れて経過を確認
すると良いかもね。
841 :
838 :2007/12/19(水) 18:52:48
>>839 ありがとうございます その考え方で考えて見ます
>>840 言葉足らずですみません もう一度見直してみます
結果表示の場所は間違えただけだと思うが、 その結果を足し算で使っちゃってるa,bを使ってる if文とwhile文の判定が全部逆 の2つだな
いろいろ突っ込みどころあるけど、一番の問題はifとelseの間に文挟んじゃってることだな。
844 :
838 :2007/12/19(水) 19:08:57
>>842 見直しの参考にさせていただきます ありがとうございます
>>843 助言ありがとうございます エラーが消えてくれました
845 :
838 :2007/12/19(水) 19:22:13
皆様のアドバイスを参考に考えてみたらなんとか完成しました 本当にありがとうございました
個人的には、「どこが間違っているか」よりは「どうやって間違いを見 付けるか」をアドバイスしたいところてん。
長いプログラムを書くときに、 分割コンパイルをつかうと聞いたんだけど、 いくらかファイルにわけて分割コンパイルはしているが 段階的に実行できていない。 段階的に実行することを説明してる本もしくはサイトないですか?
構造体の配列をmallocでメモリ確保したいのですが、 そのときの構造体の宣言は struct kani{ char gazami[20]; char zuwai[20]; char zarigani[20]; }; のままじゃだめなんですか?
三角形の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) ); 自分なりに作ってコンパイルも通るのですが、おかしな数字になってしまいます。 間違っているところありましたらご指摘お願いします。
はじめのうちは、使っている変数全ての内容を、 ・初期化後 ・ループ中 ・終了前 で出力させれば十分だろう。 でも、デバッグコードは可読性を損なう原因になり、コードが長くなるとバグの原因にもなりうる。 「書かなければバグは入らない」の大原則に従えば、デバッグコードも書かないほうがいい。 本当はデバッガの使い方を覚えるのが一番だな。
852 :
デフォルトの名無しさん :2007/12/19(水) 20:14:52
>>849 struct kani{
char* gazami;
char* zuwai;
char* zarigani;
};
ってことかな。
854 :
849 :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)); : こういうものだと思っていたんですが、全然動かなくて
struct kani* inu;
>>854 ×struct kani inu;
○struct kani *inu;
infがでるときってどういうとき?
860 :
デフォルトの名無しさん :2007/12/19(水) 21:52:18
>>859 あなた自身の内に秘めた、無限の力が解き放たれたとき
マジレスすると、浮動小数点で表すことのできる値の上限を超えたとき。
だったかなw
861 :
847 :2007/12/19(水) 21:54:12
段階的にチェックするには main関数と複数あるうちの1つずつ関数をコンパイルにかけるんですよね? makefileとかはつかってますよ。 ただし関係ある関数をあつめて1つのファイルにして 複数のオブジェクトを作って実行はやってますけど。
>>861 > 段階的にチェック
っていう意味が通じてない。
>>848 はがんばって解釈したようだが「そうではない」ってことなのかな?
(cc の -o ってそうだっけ?)
うまく伝えられないのなら、
1.自分の問題を、これ以上出来ないってほど単純化した環境を作り、
それを貼り付けるなり、貼り付けるには大きすぎる場合はどこかにアプする。
2.やりたいことを具体的に書く。
3.やったことと結果を具体的に書く。
あたりで伝えよ。
864 :
847 :2007/12/19(水) 22:22:34
一般的に大きなプログラム作るときに 段階的に実行していくんじゃないの?
>>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に置き換えよ。
せめてコンパイラが何か教えてくれ。
加えて、こういうことではないなら、何がしかヒントをくれ。
867 :
847 :2007/12/19(水) 22:35:38
入力ファイルがあるとしてそれを取り入れる関数 検査ファイル1があるとしてそれを取り入れ処理する関数 検査ファイル2があるとしてそれを取り入れ処理する関数 検査ファイル3があるとしてそれを取り入れ処理する関数 出力結果を出す関数 この5つが別々にファイルかかれてるとして 入力ファイルがあっているか、 1つめの検査ファイルの結果があっているか、 2つめ。。。そして最終的な結果があっているか。 っていう風にみていきたいんだけど。どういう風にすればいいのかなって。
それ分割コンパイル関係ないだろ
分割コンパイルについて何か根本的な勘違いをしてる気がする
870 :
847 :2007/12/19(水) 22:46:16
自分がきいてるのは分割コンパイルってどうやってやるんですか じゃなくて段階的に実行するときにどうやって分割コンパイルを使うのか ですよ
>>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; }
こういことか?
872 :
847 :2007/12/19(水) 22:51:17
そうです
>>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"を下記内容で作成。
以下同文。
これで君の質問は終了でよいか?
#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にした変数は書き換えられなくなるのですか? それとも、初期化できなくなる、という意味なのでしょうか?
>>874 その参考書にはstaticの説明が書いてないのか?
ったりめえだろ
>>874 関数内で定義したstatic変数は、その関数からしか見えないだけで、そ
れ以外はグローバル変数と同じような挙動。だから、初期化 gokei = 0
というのはプログラム開始時にしか行われない。関数に入る度に gokei
= 0 されるのではない。
>>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関数以外からでもアクセスできるかどうかの違いだけ。
君がどう思うかどうかは関係ない。
は?
とりあえず貼り付ける時はタブは無視されるからスペースなりで書き換えてくれ 見づらくて仕方が無い
>>858 OpenSSLのライブラリを読み込んでないんだろ。
>>882 gcc -lssl
とライブラリを指定したらあっさりできました・・
インクルードファイルを指定するだけではダメだったんですね・・orz
ありがとうございました
ラウールはカペッロが引き止めたんだろ 馬鹿なことは止めてくれとフロントにいって
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
Cのリファクタリングみたいな本はないのかな?
デザパタならともかくリファクタリングなんて手続き型ベースの言語ならみんな同じようなもんだと思うが。
>>886 お前はリファクタリングを全然理解していない
3章、4章、6章の一部、8章の一部、9章は
手続き型の言語でも有効なテクニックだぞ
なんかカチンとくるよな。
ティンとキター
みんなエスパーすぐる。何話してるのかさっぱりわからんw ・環境 ・目的 ・疑問点 ・ソース(一部抜粋でも可) くらいは最低でも書いて欲しいところ。
892 :
800 :2007/12/20(木) 08:04:24
800です。
malloc,free またはreallocで配列を定義しなおすと、いちいち全データコピーが発生するようですな。
やってみましたが、無駄に工程数が増える感じで、しっくりこなかったです。
もっとも、学生数数百人分のデータ程度なら、どのみち処理は一瞬で済んだので、動作スピード的にストレスに感じることはなかったですが。
そこで、
>>804-806 の人が教えてくれた、「リンクリスト」「リスト構造」とやらを調べてみました。
おおむね、要素数が不確定な配列で、要素をシンプルに増減させるサンプルは作れました。
これって、増減の処理はリンクを書き換えるだけでいいとして、
目的の箱に読み下記したい場合、そこまでアクセスするのにいちいちスタートに設定した領域から、
for文などで必要回数分回して辿らないと探せないような感じですが、この処理は無駄ではないですか?
普通に配列で取り、各要素に読み書きするのと比べて、アクセスピード的にどのぐらいのデメリットになりますか?
前者(malloc-freeまたはrealloc)を使うのと、後者(リスト構造)を使うのとどちらを選択すればいいか悩むところです。
要素の増減: 前者<<後者
要素へのアクセス: 前者>>後者
になりそうな想像ですが、プログラマーのみなさんはどちらを主に使いますか?
配列とリスト構造のどっちを使うかはケースバイケースだよ。
どっちも使うし、そんなことを人に聞いたりしないわ
たとえば、要素を番号で指定するのは配列が便利だが、 途中の要素を削除したり途中に追加したりするには不向きだ。 線形リストは線形探索には向くが、2分探索なんかはできない。 そのかわり、要素の追加/削除が簡単だ。 そんな風に使い分ける。
両方とも、弱いところをなくした工夫バージョンもあるしな
配列を使う場合最初を多めにしてあまり再定義しなくてすむようにして使うな
898 :
デフォルトの名無しさん :2007/12/20(木) 10:21:04
int *p[10000]; と多めにとって置いて Gakuseimeibo *x; を10確保したら、初めのアドレスをpに追加する あとはリストにする すると10万人登録でき、アクセス時間は最大で10個たどるだけ
ランダムアクセスが多いようなら malloc/realloc、 要素の増減が頻繁ならリスト
>>892 どんなアルゴリズム・データ構造も長所短所がある。
何をしたいか、どんな機能が必要かによって実装を選択するのですよ。
適切な実装を選択するのも、プログラマーの能力です。
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の用途を考えるとそうむやみに使うもんでもない。
902 :
849 :2007/12/20(木) 13:24:04
遅くなったけど解決しました。 どうもありがとう。
903 :
874 :2007/12/20(木) 14:43:19
904 :
デフォルトの名無しさん :2007/12/20(木) 14:50:21
C言語といえばプログラム終了時にいちいちfreeするバカいるじゃん? あれマジやめて欲しいよね。 コードサイズは増えるしなによりfreeする際に HDDにスワップアウトしていた領域をまたガリガリアクセスするからもう最悪。 gotoどころじゃない害悪ありまくりの糞作法だよ。
905 :
デフォルトの名無しさん :2007/12/20(木) 15:05:26
main(){}ではしなくて良いが、f(x){ } とかではしないと確保されたまま
局所的なmalloc()ではfree()が必要。 プログラム終了まで使うmalloc()はfree()が不要。 それだけのことだろ。
>プログラム終了時に
908 :
デフォルトの名無しさん :2007/12/20(木) 15:19:05
static 用途ならfreeしてはいけない
プログラム終了時のfreeの有無で何か違ってくるの?動作的に。 勝手にfreeしてくれる、程度の認識なんだけども。
どうせ風呂はいるんだからウンコしてもケツ拭かなくていいって事だよ。
>>904 >HDDにスワップアウトしていた領域をまたガリガリアクセスするからもう最悪。
じゃあこれって明示的にfreeしなくても起こるんじゃないの?
912 :
デフォルトの名無しさん :2007/12/20(木) 15:22:49
プログラムが解放するかOSが開放するかの違い freeがヘボならOSに任せる OSのほうが性能上だろう
だよな やっぱトイレットペーパーは節約しないとな
914 :
デフォルトの名無しさん :2007/12/20(木) 15:24:11
たとえば、C言語用のfopenとwinAPIのcreateの違い
なるほど、ウォシュレットとシャワーの差か。
916 :
デフォルトの名無しさん :2007/12/20(木) 15:26:44
静的確保も、動的確保も終了時にはOSが解放する 動的だけ自分で解放することも無い
(´-`).。oO(freeするのがバカなら、わかってないくせにわめく904は果たして何なのだろう)
一番楽なのは、どんどんプロセスを作る。 killしちゃえば綺麗に解放される。 ただし重くなる諸刃の剣
919 :
デフォルトの名無しさん :2007/12/20(木) 16:10:03
opendir()でディレクトリを開く際に、 「Program Files」や、「Documents And Settings」フォルダを指定することってできますか? ロングファイルネームのディレクトリ名や日本語ディレクトリ名は大丈夫でしたが、 あいだにスペースが入ったフォルダだけは読み込めないようで・・・
>>919 opendir()っていうUNIXっぽい関数が出てくるのに、「Program Files」
とかWindowsっぽい名前が出てくるのが怪しげ。ちゃんと環境を書くべし。
でもまあUnix系でも空白ファイル名あるし
922 :
デフォルトの名無しさん :2007/12/20(木) 17:27:28
>>923 実行時エラーなのかコンパイルエラーなのか、エラーメッセージは何か、くらい書いてくれ。
LISTなのかPARENTなのか、ごっちゃになってるぞ。
で、、、LISTのメンバーのparent は struct PARENT * で PARENT のメンバーのcfirst、clastはstruct LIST *なんじゃないの? あー、、struct XX は typedef したほうがすっきりするぞ。 あとnextとかprevもへんだろ
#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
ありがとうございます。修正してコンパイルしてみたんですけど、 今度は「23:呼び出し時のパラメータが足りない」と出ました…
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 だろう
932 :
928 :2007/12/20(木) 20:33:22
fcloseをしてないときにエラーだすのってどうやるの?
そりゃ
>>931 でやれば一発で出るが、再帰関数の勉強してたんじゃないのかw
935 :
デフォルトの名無しさん :2007/12/20(木) 20:53:14
再帰関数(の勉強している事)すらしらないほどなんだろう
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回のループごとに出力されます
printfのフィールド幅指定はだめか?
詳しくお願いします
>>938 printf("%-10d %-10d", a, b);
-は左揃え、10は桁数
あとは分かるだろ
っつか、printfぐらいぐぐれよw
あ、小数点入れるのか %-12.8dぐらいがいいかな
なんでdなんだよ(w
ごめんf www しかも\nもないwww
>>933 fopen/fcloseをラップして開いていくファイル数をすべて管理してプログラム終了時点にチェックする
fcloseしたFILE *がどうなってるかって処理系依存?
nullでも代入しといてnullになっていないFILE *が閉じていないとかできるかと思ったけどだめっぽいな
ちょっと失礼します。 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]); } }
変数wが初期化されておらず、中にどんな値が入っているか不明なまま使っているのが問題。
>>944 >>945 に加えて・・・
scanfをforで回しても、おそらくおぬしの意図した動作はしないぞ。
あと、出力処理の周辺が意味不明。
for文が2個あることも、ifがあることもワケワカメ
>>945-946 レスありがとう
初期化しても駄目なんです…
わしが意図してる動作はどうすれば可能なのですヵ?
出力に関しては空白があったらその後の文字を表示させるというものです。
何とかbreakできればうまくいくと思うんです。
>>947 そもそも何でbreakしたいんだ・・・
空白を含めすべて文字列を読み込むんで、出力のとき空白までを無視すればいいじゃないか
>>948-949 w=0;
こんな感じです。
>空白を含めすべて文字列を読み込むんで、出力のとき空白までを無視すればいいじゃないか
それができたならこんな苦労してないですよ…
どうやって空白までを無視できるんですか??
isgraph
キーボードからとある文字を受け取ったらループから抜けたいんでしょ? なら forループ内にifいれて strcmpで比較して一致の場合にbreakでループぬけりゃいいんじゃね?
よく使うのが if( strcmp(str,"end") == 0 ) break; endと入力したら一致でループ脱出
>>954 ありがとう
う〜ん、何故か文字化けが発生してまう
>>950 そりゃどう引っ繰り返したってbreakしないわけだ。
その理由が判らないなら、そんなカスみたいなコードは捨てて入門書をきちんと読め。
957 :
800,892 :2007/12/21(金) 01:46:03
>>893-897 ,900
ありがとうございます。
用途によって使い分ければ良いということですね。
>>899 工夫してみます。
>>901 >Cの用途を考えるとそうむやみに使うもんでもない。
Cの用途とは?
OSやアプリケーション、組み込みに至るまでソフトウェア開発で広く使われている言語という認識でしたが、
リスト構造が不向きな用途とはどのようなものか、
詳しく教えていただけるとさいわいです。
ORZ式C言語入門 オワタの教える簡単C言語 とか執筆しようかな
>>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に。*/
}
>>959 あんたも入門者?
w='0'って、何考えてるの?
>944のやりたいことって、 char a[100]; fgets(a, sizeof(a), stdin); printf("%s", strchr(a, ' ')); ってことじゃないのかね。
>>957 >リスト構造が不向きな用途とはどのようなものか、
たとえば2分探索できるかどうか、考えてみなよ。
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)は等しいという事は、保証されていますか?
>>964 sizeof演算子の結果はオペランドの型で決まるので、どちらでも同じ。
どちらが常套手段、と言うことはないだろう。好みの問題。
ちなみに規格票には
sizeof array / sizeof array[0]
という例が載ってた。
>>964 何かトリックでもない限り、問題ない。
前者はstDataの型が変わっても使えるメリットがある。
967 :
964 :2007/12/21(金) 09:27:33
ありがとうございます。 どちらかは、構造体の境界をパティングしたサイズで、 一方はパティングしていないサイズが出るのかと、 変な妄想してました。
パディングされてないサイズなんか返されても、それでmallocできないじゃん
969 :
デフォルトの名無しさん :2007/12/21(金) 13:01:55
do-while文の終了条件を教えてエロイ人☆ まじで卒業できないよう><
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
Cのスレでそれはないだろう、せめて == で
C言語を最近勉強し始めたものですが C言語を動かすためにサイトを見てまわったんですが そこで『Borland C++ Compiler』をインストールしてどう使うかのサイトを参考にしたんですけど コンパイラはできたんですけど、実行ファイルをクリックしても画面が一瞬出るだけで すぐに消えてしまうんです。何か解決方法はありますでしょうか? ちなみにOSはVistaです。
もうコマンドラインなんてのが時代遅れなのでしょうかねぇ
bccのGUIラッパーでも作って配布しようかなあ……y
C言語でプログラミングを始めようと思い、Visual C++2008をインストールしたばかりの超初心者です 早速入門サイトに乗っていたコード(Hello worldの表示)を打ち込み、コンパイルしようと思ったのですがやり方が分からなくてかれこれ2時間ほど固まっています 「ビルド」というのはどこをどうすれば出来る処理なのでしょうか
>>980 2005だとメニューにビルドがあるけど、2008だと違うのだろうか。
>>980 VCの仕様変更がされてなかったら、F7でビルド、Ctrl + F7でコンパイル。
プロジェクトを作成してないとメニューにビルドがでないな
984 :
923 :2007/12/22(土) 06:03:05
おっかなびっくりで前に進めました、
>>924 さんどうもありがとうございました。
実行時エラーと戦ってるので近いうちにまたくることになりそうです(;´д⊂)
985 :
質問 :2007/12/22(土) 10:38:52
C言語で作れる方ご教授願います。 名前:山田 太郎 カナ:ヤマダ タロウ 上記のように、名前欄を入力した場合、カナ入力欄に自動で入力させる 方法を調べております。 どなたか、ご教授宜しくお願いします。
987 :
質問 :2007/12/22(土) 10:58:59
失礼しました。
>>986 C言語で作れる方ご教示願います。
名前:山田 太郎
カナ:ヤマダ タロウ
上記のように、名前欄を入力した場合、カナ入力欄に自動で入力させる
方法を調べております。
どなたか、ご教示宜しくお願いします。
重要なのは二行目の方じゃねw
>>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つにファイルわけて分かりやすくするの? サーバとかワケわからないんだけど
Windowsなんでしょ?imm32でぐぐれって
>>990 OS書けよボケ
Windowsならimm32ってヒントが出てるんだから、
更に質問する前に自分でちょっとは調べろよ。
>>992 キミの部屋にあるコンセントと、それに繋がっている電気機器を考えるんだ。
#ifdef の typedef 版は何になるのでしょうか?
ない。互いに全く関係ない機能だ。
#ifndef bool #define bool #endif 見たいな感じで typedef int bool; が定義されてたら、宣言しない見たいなのは無理でしょうか?
1000 :
質問 :2007/12/22(土) 11:59:58
>>993 自社ソフトにて、顧客入力箇所があり、
名前:とカナ:で入力箇所が異なるセル内で、同時入力ができれば
と思い、質問させて頂いております。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。