C言語なら俺に聞け(入門篇) Part 4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/09(木) 00:31:01・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 3
http://pc8.2ch.net/test/read.cgi/tech/1160682950/
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
関連スレ
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/
0455πr^2
2006/11/19(日) 11:16:01などとなっているchar[]のポインタをリターンする関数はどう宣言すればいいのでしょうか。
0456デフォルトの名無しさん
2006/11/19(日) 11:18:02{
static const char * const static_strings[] = {"string1", "string2",};
return static_strings;
}
0457πr^2
2006/11/19(日) 11:40:13char ** foo();
int main(){
char **str = foo();
}
char ** foo()
{
static const char * const static_strings[] = {"string1", "string2",};
return static_strings;
}
をコンパイルすると、
エラー E2034 strtest.cpp 10: 'const char * const *' 型は 'char * *' 型に変換できない(関数 foo() )
というエラーがでました
0458デフォルトの名無しさん
2006/11/19(日) 11:52:54const char * const * foo() // 以下略
0459πr^2
2006/11/19(日) 13:06:06const char * const foo()でできました!
ところで、char* str[];とし、str[]の配列の数を決めるときはどのようにするのでしょうか。
char *str[] = new char*[20];としても、
'char * *' 型は 'char *[]' 型に変換できない
とエラーがでてきてしまいます。
0460デフォルトの名無しさん
2006/11/19(日) 13:10:33数を別に渡すしかない。
0461デフォルトの名無しさん
2006/11/19(日) 13:43:59#include<math.h>
int main(void){
int a,b,c;
double kotae;
printf("aの値は入力:");
scanf("%d",&a);
printf("bの値は入力:");
scanf("%d",&b);
printf("cの値は入力:");
scanf("%d",&c);
kotae=sqrt(b*b-4*a*c);
printf("%f",&kotae);
return 0;
}
何を入力しても答えが0になってしまいます
ボスケテください
0462デフォルトの名無しさん
2006/11/19(日) 13:56:27#include<stdio.h>
#include<math.h>
int main(void){
int a,b,c;
double kotae;
printf("aの値は入力:");
scanf("%d",&a);
printf("bの値は入力:");
scanf("%d",&b);
printf("cの値は入力:");
scanf("%d",&c);
kotae=sqrt(b*b-4*a*c);
printf("%f",kotae);
return 0;
}
0463デフォルトの名無しさん
2006/11/19(日) 14:00:54実行してみたのですが、答えがNaNと表示されました・・・
0464デフォルトの名無しさん
2006/11/19(日) 14:01:24↑
0465463
2006/11/19(日) 14:03:29計算されてました
でも、答えがマイナスになる場合だとNaNとでるのですが、
マイナスの答えまできっちり表示させる方法ってありますか?
0466デフォルトの名無しさん
2006/11/19(日) 14:05:500467デフォルトの名無しさん
2006/11/19(日) 14:09:29ていうか>>461は(b*b-4*a*c)のところの計算の順序はこれでいいの?
0468デフォルトの名無しさん
2006/11/19(日) 14:10:20晒し
0470デフォルトの名無しさん
2006/11/19(日) 14:11:41正直キャストが面倒くさい
0471461
2006/11/19(日) 14:14:03>>467
なるほど、そういうやり方あったんですね、気づきませんでしたorz
式はあってると思います・・・・・思います・・・
0472デフォルトの名無しさん
2006/11/19(日) 14:19:54おいおい、
虚数を扱えるライブラリを紹介しろとか
そういうのじゃないのか。
0474デフォルトの名無しさん
2006/11/19(日) 14:57:530475448
2006/11/19(日) 15:22:47超亀レス申し訳ありません
つまり、前の文字列と後ろの文字列の間のスペースということですか?
これを無くして書くことはできないのでしょうか?
0476デフォルトの名無しさん
2006/11/19(日) 15:27:15>448のprintf()なら、これと等価だろ。
printf("%s\n",horse_pos[r] + strlen(horse[r]),horse[r]);
要は、文字列をずらすために空白文字で調整したいのだろうから。
0478デフォルトの名無しさん
2006/11/19(日) 16:47:09使用配列とポインタ変数
int suchi[5];
int *saidai,*saisyou;
ポインタ変数とかポインタとかよく分かんないorz
このプログラムはどう書けばいいのでしょうか?
0479デフォルトの名無しさん
2006/11/19(日) 16:52:26C/C++の宿題を片付けます 76代目
http://pc8.2ch.net/test/read.cgi/tech/1162771475/
0480448
2006/11/19(日) 16:57:14printf("%s\n",horse_pos[r] + strlen(horse[r]),horse[r]);
て%s%sじゃなくていいんですか?
0481デフォルトの名無しさん
2006/11/19(日) 16:58:220483デフォルトの名無しさん
2006/11/20(月) 00:58:40sqrt()する数値をabs(b*b-4*a*c)
にして、
abs(b*b-4*a*c)!=b*b-4*a*c
だったらb*b-4*a*cは負の数になってるので、
答えの最後に「i」を表示すれば一応ソレらしきものにはなるのでは
0484デフォルトの名無しさん
2006/11/20(月) 01:23:27#include <stdio.h>
int main(void){
printf("%*s","hogehoge",10);/*10は適当な数値*/
return 0;
}
はどこか構文間違えていますか?
コンパイルは通るのですが、不正終了してしまいます
三行目printf("%*s","hoge","piyo",10);にすれば実行は出来ますが
数千個分の改行とスペースが出力されるだけです
環境はWinXP VC++Toolkit2003です
%10sのようなフィールド幅指定は問題ありませんでした
0485デフォルトの名無しさん
2006/11/20(月) 02:16:490486484
2006/11/20(月) 02:25:02すみません、初歩的なミス過ぎますね・・・
夜更けにどうもありがとうございました
0487デフォルトの名無しさん
2006/11/20(月) 05:21:50とはどう言う意味でしょうか?
あと
for(;;)と言うのも参考書に載っていますが
意味がわかりませんので
これら二つの、ご助言を宜しくお願い致します。
こちらのスレで質問するのが正しいと思いました
マルチではありません。
0488デフォルトの名無しさん
2006/11/20(月) 06:23:54質問を撤回してない
マルチ氏ね
0489デフォルトの名無しさん
2006/11/20(月) 06:46:080490デフォルトの名無しさん
2006/11/20(月) 15:31:07#include<stdio.h>
#include<stdlib.h>
main()
{
int i,j;
int ***z;
z = (int ***)malloc( 3 * sizeof(int **));
z[0] = (int **)malloc( 4 * sizeof(int *));
z[0][0] = (int *)malloc( 3 * 4 * 5 * sizeof(int));
for(i=0;i<3;i++){
z[i] = z[0] + i * 4;
}
for(i=0;i<3;i++){
for(j=0;j<4;j++){
z[i][j] = z[0][0] + i * 5;
}
}
free(z);
return 0;
}
0491デフォルトの名無しさん
2006/11/20(月) 15:33:48free(z)だけでは足りない。
free(z[0][0]);
free(z[0]);
free(z);
0492デフォルトの名無しさん
2006/11/20(月) 19:06:41以下のようなコードを書いたところ、コンパイル時に
error: dereferencing pointer to incomplete type
というエラーが出てしまいます。
typedef struct sa *sa_p; // 先に sa のポインタだけ定義
typedef struct {
sa_p a2;
} sb, *sb_p;
typedef struct { // sa の本体を定義
sb_p b;
} sa;
int main() {
sa_p a = (sa_p)malloc(sizeof(sa));
a->b->a2 = a; // compile error
return 0;
}
0493デフォルトの名無しさん
2006/11/20(月) 19:30:58コンパイルが通らないのは当然かつそれでは実行時も落ちるだろう。
>typedef struct { // sa の本体を定義
> sb_p b;
>} sa;
ここで無名構造体をtypedefしたsaと本来のstruct saが別物になってる。
でもって
> a->b->a2 = a; // compile error
ここでおそらく落ちる。ちゃんと
a->b = (sb_p)malloc(sizeof(sb));
とやってからにしろ。
0494デフォルトの名無しさん
2006/11/20(月) 21:45:35Cでも作ることはできるのでしょうか?
0495デフォルトの名無しさん
2006/11/20(月) 21:49:35クロスコンパイラ持ってれば出来るんじゃね?
0496デフォルトの名無しさん
2006/11/20(月) 22:26:22やっぱりプロトタイプ宣言はすべきなのですか?
これは、一番上にmain関数をもって行けば早い話であって、
関数を変えた時にプロトタイプ宣言を変え忘れて、
コンパイラが通らないと言う事も起きたりするので
別に必要ないんじゃ無いかと思ったりしてるからです。
0497デフォルトの名無しさん
2006/11/20(月) 22:34:33そのうちソースとヘッダを分けることを覚えたら、自然と気にならなくなるだろうし。
0498デフォルトの名無しさん
2006/11/21(火) 00:58:36リアルタイムにキー操作を取るにはどうすればいいんでしょうか。
scanfなどでは入力待ち状態になってしまいますし・・
0499デフォルトの名無しさん
2006/11/21(火) 01:00:05kbhit
getch
で調べてみれば?
0500デフォルトの名無しさん
2006/11/21(火) 01:04:06正直、Windowsで作ってるなら、ライブラリを使ったGUI方がはるかに楽だよ。
コンソールは面倒。
たぶん、Win以外もライブラリ使用のほうがらくだと思う。
0501デフォルトの名無しさん
2006/11/21(火) 01:08:13それを乗り越えれば、楽だろうけど。
0502デフォルトの名無しさん
2006/11/21(火) 01:10:34#include<stdio.h>
#include<conio.h>
intmain(void){
intmoji='-';
while(1){
if(kbhit())moji=getch();
printf("\r%c [%3d]", moji, moji);
}
return 0;
}
0503デフォルトの名無しさん
2006/11/21(火) 01:12:452chからリンクするのは気が引けるが
初心者からそこそこの上級者までお勧めできる。
(ただ、なんでもかんでもintが活躍するので、少し危険性も高いが)
0504デフォルトの名無しさん
2006/11/21(火) 01:20:00if(kbhit()){
switch(getch()){
case 75: //キー入力は左カーソル
printf("left");
break;
case 77: //キー入力は右カーソル
printf("right");
break;
case 32://キー入力はスペース
printf("space");
break;
}
}
という感じで出来ました。
コードも載せていただきありがとうございます。
Dxlibも調べてみますね。
0505デフォルトの名無しさん
2006/11/21(火) 01:25:08カーソルキーは一回押すと二つコードが送られるよ
自分で試して確認しな
0506デフォルトの名無しさん
2006/11/21(火) 01:35:14それらのペアを配列を使って読んで、
それぞれの四則演算を別のファイルに書き出しなさい。
5.0 3.0
2.5 1.0
4.0 1.5
って課題が授業で出てサッパリわかんなくて困ってるんですが、
どなたか助けていただけないでしょうか?
0507デフォルトの名無しさん
2006/11/21(火) 01:36:14>>1
0509デフォルトの名無しさん
2006/11/21(火) 11:20:59今は以下のようにしています。関数の戻りで値コピーでなく、ポインタ渡しでやりたいです。
typedef struct tagX01
{
int val1;
car *val2;
} *LPX01, X01;
呼び出し
LPX01 x01;
x01 = (LPX01)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(X01));
CreateX01(x01);
BOOL CreateX01(LPX01 target) {
// ここで値設定
}
この、HeapAllocで領域作っているところを、CreateX01の中に入れたいです。
単に、入れるとx01が初期化されていないとコンパイラが警告してきます。
0510それで判らなきゃ大抵間抜けだ
2006/11/21(火) 11:24:35下請け関数を先に定義するかプロトタイプ宣言をするかしないとコンパイラが型チェックをしてくれない典型。
先ずはそこからやって味噌。
0511デフォルトの名無しさん
2006/11/21(火) 12:27:27BOOL CreateX01(LPX01 target) を
BOOL CreateX01(LPX01 *target)とかにしないと作ったやつを返せナインぢゃないですか?
0512デフォルトの名無しさん
2006/11/21(火) 12:46:25LPX01がポインタ型だから、それは問題ない。
> 単に、入れるとx01が初期化されていないとコンパイラが警告してきます。
挙げてあるコード片はそんな警告が出るようには見えないけどな。
完全なソースを挙げるべし。
0513512
2006/11/21(火) 12:48:03>>511のようにするか、CreateX01()の戻り値をLPX01にするかですね。
0514デフォルトの名無しさん
2006/11/21(火) 13:02:49>>512-513
ご回答ありがとうございます。
やっぱ、ポインタのポインタを渡さないといけないんですね。ありがとうございました。
typedefでつける銘銘なんですけど、構造体はtag[名前]、構造体へのポインタLP[名前]がWindowsAPIっぽくてかっこいいんですが、
ポインタのポインタは命名せずに*LPX01とかが一般的ですか?SDKのヘッダをLPでGREPしてみましたがそれっぽいのがないです
ポインタのポインタになってるやつはLPVOIDが多い気がしますがいろんな型がかえってくるからかなぁと想像しています
0515デフォルトの名無しさん
2006/11/21(火) 13:10:14Win32 APIみたいにポインタを「LPほげ」とすること自体が、一般的で
はないし、ダサい。
0516デフォルトの名無しさん
2006/11/21(火) 13:13:28かっこいいとおもっていたのでキツいです
かっこいいのはどんなかんじですか?例かかっこいいっぽいソースとか教えてもらえないですか。
0517デフォルトの名無しさん
2006/11/21(火) 13:21:59switch 文に変換不可能かを教えて欲しいです。
0518デフォルトの名無しさん
2006/11/21(火) 13:41:49ある型のポインタにわざわざ型名を割り当てるのは、ポインタであることを見失いやすく却って読み辛くなる。
素直にX01 ** fooで充分だ。
>>517
条件式が定数との一致以外のとき。
#つまり、switchにできる方が例外的。
0519デフォルトの名無しさん
2006/11/21(火) 13:59:05たとえば、
・条件が複数の変数を参照するとき
・条件が整数の定数ではないとき
・整数で分岐だけど、範囲が広過ぎるとき (i < 0 のような)
0520デフォルトの名無しさん
2006/11/21(火) 14:16:01case 0:
break;
default :
}
0521デフォルトの名無しさん
2006/11/21(火) 17:57:50なるほど。別名をつけるのがすでに間違いなんですね。
WindowsSDKではtypedefで構造体とポインタに別名をつけているのが決まりみたいだったんで、
当たり前だと思ってました。実はWindowsSDKがカッコ悪くて、悪い例だったんですね。レス、ありがとう。
0522デフォルトの名無しさん
2006/11/21(火) 18:05:14画面から入力した文字列を逆に表示するというのは
どうやったら表示できますか?
0523デフォルトの名無しさん
2006/11/21(火) 18:07:41どうやったらできますか?
0524デフォルトの名無しさん
2006/11/21(火) 18:08:38Eがヨになるって事?
0525デフォルトの名無しさん
2006/11/21(火) 18:47:37c言語でかなりの数の数値計算を行うソフトウェアに挑戦しています。
ただ、それを実行するとメモリのinactiveがドカーンとできてしまい、
プログラムが終了しても大きく確保されたままです。
メモリの動的な確保などはしていません。
これは私のプログラムにマズい部分があるのでしょうか?
それとも問題ないのでしょうか?
0526デフォルトの名無しさん
2006/11/21(火) 18:58:34Linuxか?
大丈夫、他の用途に使いたくなったらOSが勝手に回収する。
処で、malloc()などを使わないでどうやってメモリを確保しているんだ?
0527デフォルトの名無しさん
2006/11/21(火) 19:03:51こういう事?
char* reverse(char *s)
{
char t, *l = s, *r = s + (strlen(s) - 1);
if(s == NULL){ return NULL; }
while(l < r){
t = *l;
*l = *r;
*r = t;
++l;
--r;
}
return s;
}
0528デフォルトの名無しさん
2006/11/21(火) 19:55:22勝手に回収すると聞いてちょっと安心です。
ありがとうございます。
環境は実はMac OSXです...(汗
ええっと。動的な確保自体をやっていないつもりなんです。
(答えになっているのかどうか不安ですが...すみません)
0529デフォルトの名無しさん
2006/11/21(火) 20:30:13・ライブラリが内部で動的確保をしている可能性
例:C標準関数のstrdup
2.巨大な静的又はグローバルな配列を宣言していないか
・スタートアップで静的領域に一気に確保される
0530デフォルトの名無しさん
2006/11/21(火) 20:38:220531デフォルトの名無しさん
2006/11/21(火) 20:48:43hogehoge \t hoge \n
と言う文字列(char配列)に"ABC"という文字列を加えて
hogehoge \t hoge \t ABC \n
としたいのですが,hogehoge,hogeの長さが任意のため
どこまでをコピーするのかで困っています.
どのように既述をすれば良いのでしょうか?
よろしくお願いします.
0532デフォルトの名無しさん
2006/11/21(火) 21:00:210534デフォルトの名無しさん
2006/11/21(火) 21:29:19やべ。まさしく2でした。
でっかいグローバルな構造体の配列がありやす
もっかい勉強し直してきます。
1についても初めて聞きました。勉強になりやした。
ありがとね。
0535デフォルトの名無しさん
2006/11/21(火) 21:49:28方法を教えてください。
char string = "ABCDE/FGHIJ";
として
文字列に'/'があったら、それ以降を削除したいのです。
s_point = strstr (string, "/");
*s_point = '\0';
で行けると思っていたのですが、コンパイルにはエラーは
ありませんが、実行するとエラーが出て止まってしまいます。
Borland Cコンパイラ(フリー版)とWin2000で、
DOSプロンプト上での実行です。
何か案がありましたら、よろしくお願いします。
0536デフォルトの名無しさん
2006/11/21(火) 21:54:04こうすればOK。
0537デフォルトの名無しさん
2006/11/21(火) 21:55:01char string[] = "ABCDE/FGHIJ";
0538デフォルトの名無しさん
2006/11/21(火) 21:55:19これじゃ駄目だから間違えるなよ。
たとえ上手く動いてるように見えても絶対駄目だからな。
0539デフォルトの名無しさん
2006/11/21(火) 21:55:450540デフォルトの名無しさん
2006/11/21(火) 21:56:59ごめんなさい。
その部分は書き込みが間違えていて、ちゃんと
char string[] = {"ABCDE/FGHIJ"}; にしていました。
0541デフォルトの名無しさん
2006/11/21(火) 21:57:06どっちが正しいの?
0542535
2006/11/21(火) 21:58:27○ char string[] = "ABCDE/FGHIJ";
何度もすみません。
0543デフォルトの名無しさん
2006/11/21(火) 22:00:54上のが正しいだろ。常識的に考えて。
0544デフォルトの名無しさん
2006/11/21(火) 22:12:15char a[] = {'a','b','c','\0'};
char b[] = "abc";
printf("%s\n%s\n", a, b);
0545デフォルトの名無しさん
2006/11/21(火) 22:12:56その前後のコードも晒してよ。
それだけじゃ特定できん。
0546デフォルトの名無しさん
2006/11/21(火) 22:16:02#include <string>
int main(void)
{
char s[] = "abcde/fghij";
char *p = strstr(s, "/");
*p = '\0';
printf("%s\n", s);
return 0;
}
0547デフォルトの名無しさん
2006/11/21(火) 22:23:24お前は何を言っているんだ。
0548535
2006/11/21(火) 22:25:08問題は別のところにありました。
strstrで検索したときに、検索文字列のひとつに
"/"がなくNULLを返していたのが原因でした。
ifとかを付けずに *s_point = '\0'; としてしまい、
そこでエラーを起こしていました。
お騒がせして申し訳ありませんでした。
0549デフォルトの名無しさん
2006/11/21(火) 22:28:05あんたは何を言ってるの?
0550デフォルトの名無しさん
2006/11/21(火) 22:28:09char b[] = {"abc"};
printf("%s\n%s\n", a, b);
0551ぴゅあ
2006/11/21(火) 22:32:29>>535
>エラーが出て
というのがエラーメッセージが出ているのなら
それを示した方が良かったかもですね
0552デフォルトの名無しさん
2006/11/21(火) 22:41:07質問者は
"ABCDE/FGHIJ"
これの/以降を削除したいと言っている
コンパイルの段階で分割してどうするね・・・
0553デフォルトの名無しさん
2006/11/21(火) 22:48:41ttp://www.konaken.com/blog/milco.jpg
0554ぴゅあ
2006/11/21(火) 22:51:42あぁ 構文ではなくて"abc"とされていたことを言っていたわけですか
(てか、それなら"ABCDE"とかだろうけど)
>"ABCDE/FGHIJ"
にならうなら
char a[] = {'A','B','C','C','D','E','/','F','G','H','I','J','\0'};
char b[] = "ABCDE/FGHIJ";
後者に括弧は要らんでしょう
char c[][] = {"ABC","DEF"};
とかなら。。。
■ このスレッドは過去ログ倉庫に格納されています