C言語なら俺に聞け(入門篇) Part 8
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/02/20(火) 13:44:34・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 7
http://pc10.2ch.net/test/read.cgi/tech/1170064980/
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 http://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 http://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 http://pc10.2ch.net/test/read.cgi/tech/1167325490/
関連スレ
C/C++の宿題を片付けます 83代目
http://pc10.2ch.net/test/read.cgi/tech/1170830498/
くだすれC言語(初心者用)
http://pc10.2ch.net/test/read.cgi/tech/1153542424/l50
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc10.2ch.net/test/read.cgi/tech/1170338926/
【初心者歓迎】C/C++室 Ver.35【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1171888583/
【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
0002デフォルトの名無しさん
2007/02/20(火) 14:30:24プログラミング勉強しようと思う新1大学生何だけどお薦めの本教えてください。
勉強する順序ってC→C++でいいの?
0003デフォルトの名無しさん
2007/02/20(火) 14:34:48C言語よりC++を先に習っても問題ないですか?
http://pc10.2ch.net/test/read.cgi/tech/1130416484/l50
0004デフォルトの名無しさん
2007/02/20(火) 14:56:55小林健一郎や、米村貴裕の本はおもしろい。
0005デフォルトの名無しさん
2007/02/20(火) 15:07:09出版社は翔泳社がいいっていわれたんだけど・・・
0006デフォルトの名無しさん
2007/02/20(火) 15:14:55たいしてプログラミングやったことないのにオブジェクト指向学んでもなぁ・・・
0007デフォルトの名無しさん
2007/02/20(火) 17:16:43Cで基本を押さえてからのほうがいいと思うよ
0008デフォルトの名無しさん
2007/02/20(火) 18:34:420009デフォルトの名無しさん
2007/02/20(火) 18:44:400010デフォルトの名無しさん
2007/02/20(火) 18:55:530011デフォルトの名無しさん
2007/02/20(火) 19:13:48が、拡張された機能を使おうとすると大変。
増改築を繰り返して迷路になってしまった旅館って感じの言語仕様だからね。
0012デフォルトの名無しさん
2007/02/20(火) 20:07:050013デフォルトの名無しさん
2007/02/20(火) 20:49:010014デフォルトの名無しさん
2007/02/20(火) 20:49:3718年度 第3回
C言語プログラミング能力認定試験 の問題なんですが 解答を教えて下さいm(_ _)m
問6(プログラム説明)
入力した文字列の英大文字を英小文字に 英小文字を英大文字に変換し 表示する(省略)
(アルゴリズム)
�@文字列を入力する
�A入力された文字列の文字を1字ずつ変換し 出力領域に代入する
英大文字であれば 英小文字に変換し 出力領域に代入する
英小文字であれば 英大文字に変換し 出力領域に代入する
それ以外の文字であれば そのまま出力領域に代入する
�B出力領域の内容を表示する
(実行結果)
文字列を入力して下さい Iam21YearsOld
iAM21yEARSoLD
すいません長くて.. プログラムは次です
0015デフォルトの名無しさん
2007/02/20(火) 20:53:340016デフォルトの名無しさん
2007/02/20(火) 21:30:24/* 大文字・小文字の変換 */
#include <stdio.h>
#include <ctype.h>
main()
{
char str_i[256]、 str_o[256];
int i、j;
/* データ入力 */
printf("文字列を入力して下さい");
scanf("%s"、str_i);
/* 変換 */
for(i=0、j=0;str_i[i] != '\0';i++){
if(isupper(str_i[i]))
str_o[j++]= 【38】;
else if(【39】)
str_o[j++] = 【40】;
else
str_o[j++] = 【41】;
}
【42】;
printf("%s"、str_o);
}
0017デフォルトの名無しさん
2007/02/20(火) 21:31:46ア tolower(str_i[i]) イ tolower(str_o[j]) ウ toupper(str_i[i]) エ toupper(str_o[j])
【39】の解答群
ア isalnum(str_i[i]) イ isalpha(str_i[i]) ウ islower(str_i[i]) エ isupper(str_i[i])
【40】の解答群
ア tolower(str_i[i]) イ tolower(str_o[j]) ウ toupper(str_i[i]) エ toupper(str_o[j])
【41】の解答群
ア str_i[i] イ str_i[++i] ウ str_i[i++] エ str_i[j++]
【42】の解答群
ア str_o[--j] = '\0' イ str_o[++j] = '\0' ウ str_o[j] = '\0' エ str_o[j+1] = '\0'
以上です
携帯から長々とすいませんm(_ _)m 【38】〜【42】の答えを教えて下さいm(_ _)m
0018デフォルトの名無しさん
2007/02/20(火) 21:32:47http://pc10.2ch.net/test/read.cgi/tech/1170830498/
0019デフォルトの名無しさん
2007/02/20(火) 21:38:2138. ア
39. ア,イ,ウ
40. ウ
41. ア
42. ウ
0020デフォルトの名無しさん
2007/02/20(火) 21:49:01C始めて1週間だけど多分できた。islowerとASCLLコードを使うんじゃないかな?
【42】;のところは何も書かないでも出来ちゃったけど
0021デフォルトの名無しさん
2007/02/20(火) 21:52:02選択肢にないのを記述してた…
0022デフォルトの名無しさん
2007/02/20(火) 21:58:41>>20
○ ascii
× ascll
0023デフォルトの名無しさん
2007/02/20(火) 22:04:38書き込んでから気づいた
ハジカシス
0024デフォルトの名無しさん
2007/02/20(火) 22:22:59すいません どこか間違いらしきとことかありますかね?
19さんの解答で当たってますか?
【39】は どれも当てはまるという事なんですかね?
もう一回プログラムを確認してみます
0025デフォルトの名無しさん
2007/02/20(火) 22:27:090026デフォルトの名無しさん
2007/02/20(火) 22:32:15プログラム自体は間違い無いですかね
要は 入力された文字列を 大文字から小文字 小文字から大文字 に変換するプログラムなんですけど
ウは 2つ正解があるんですかね?
【39】はどうなんだろう...
0027デフォルトの名無しさん
2007/02/20(火) 22:37:340028デフォルトの名無しさん
2007/02/20(火) 22:38:370029デフォルトの名無しさん
2007/02/20(火) 22:45:340030デフォルトの名無しさん
2007/02/20(火) 23:17:10ウは3つ正解ですか??
0031デフォルトの名無しさん
2007/02/20(火) 23:20:22日本語としておかしい。
0032デフォルトの名無しさん
2007/02/20(火) 23:23:230033デフォルトの名無しさん
2007/02/20(火) 23:24:390034デフォルトの名無しさん
2007/02/20(火) 23:47:20答えを全部ウにしました... 3つ正解だといいんだけど..
0035デフォルトの名無しさん
2007/02/21(水) 00:25:530036デフォルトの名無しさん
2007/02/21(水) 00:29:56#include <string>
typedef struct _CALORIE{
char name[40];
float value;
} CALORIE;
int calregist(CALORIE *, int);
float calcalc(CALORIE *, int);
int main(){
CALORIE cal[500] = {
{"米飯", 150.3}, {"中華麺", 57.1},
{"蕎麦", 133.3}, {"うどん", 100.0},
{"素麺", 133.3}, {"食パン", 250.3}
};
int cal_num = 6;
int mode = 0;
printf("カロリー計算ツール\n");
0037デフォルトの名無しさん
2007/02/21(水) 00:30:31printf("登録は1を、計算は2を、終了は0を入力して下さい : ");
scanf("%d", &mode);
if(mode == 0)
break;
else if(mode == 1)
cal_num = calregist(cal, cal_num);
else if(mode == 2)
printf("総カロリー:%6.2fkcal\n\n", calcalc(cal, cal_num));
}
return 0;
}
/************************************
calregist() カロリーリストへ登録する
[引数] pcal -- カロリーリストへのポインタ
num -- 登録前のリストの要素数
[戻り値] 登録後のリストへの要素数
*************************************/
int calregist(CALORIE *pcal, int num){
printf("食品名を入力して下さい : ");
scanf("%s", (pcal+num)->name);
printf("その食品のカロリーを入力して下さい。[kcal/100g] : ");
scanf("%f", &((pcal+num)->value));
printf("登録しました。\n\n");
return num+1;
}
0038デフォルトの名無しさん
2007/02/21(水) 00:31:09calcalc() カロリーを計算する
[引数] pcal -- カロリーリストへのポインタ
num -- リストの要素数
[戻り値] カロリー数
*************************************/
float calcalc(CALORIE *pcal, int num){
char name[40]; /* 入力した食品名 */
float gram; /* 入力したグラム数 */
float totalcal = 0.0; /* 合計カロリー */
int i;
printf("--食品一覧----------\n");
for(i=0; i<num; i++)
printf("%s\t", (pcal+i)->name);
printf("\n-------------------\n");
while(1){
printf("食品名(endで計算) : ");
scanf("%s", name);
if(strcmp(name, "end") == 0)
break;
printf("グラム数 : ");
scanf("%f", &gram);
for(i=0; i<num;; i++){
if(strcmp(name, (pcal+i)->name) == 0){
totalcal += (pcal+i)->value * gram / 100.0;
break;
}
}
}
return totalcal;
0039デフォルトの名無しさん
2007/02/21(水) 00:32:25c:\source>bcc32 CL.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample21.c:
エラー E2188 sample21.c 74: 式の構文エラー(関数 calcalc )
エラー E2379 sample21.c 74: ステートメントにセミコロン(;)がない(関数 calcalc
)
*** 2 errors in Compile ***
エラーの解決ができませんので、ご指摘お願い致します。
0040デフォルトの名無しさん
2007/02/21(水) 00:37:020041デフォルトの名無しさん
2007/02/21(水) 00:38:45#include <string.h>
ちゃんとコンパイルかけたソースそのまま貼ったか?
> for(i=0; i<num;; i++){
for(i=0; i<num; i++){
BCC って不親切なエラーメッセージ出すな。
0042デフォルトの名無しさん
2007/02/21(水) 00:39:100043デフォルトの名無しさん
2007/02/21(水) 00:45:31ググって探してみたんだけど、どこにも…。
0044デフォルトの名無しさん
2007/02/21(水) 00:49:04libtiffに不満があって自分で作っちゃおうって人?
0046デフォルトの名無しさん
2007/02/21(水) 01:08:44自力でtiffを解析するサンプルを載せてるようなサイトはあまりないかも。
となると、tiffの仕様を読んで自分で作るしかないような。
tiffの仕様はlibtiffのサイトから辿れるよ。
0047デフォルトの名無しさん
2007/02/21(水) 01:17:160048デフォルトの名無しさん
2007/02/21(水) 01:17:18それのつけるときとつけないときってどう違うの?イマイチわからない。凄く初歩的でごめん。
0049デフォルトの名無しさん
2007/02/21(水) 01:20:24適当にソースを眺めてれば、規則性がわかるんじゃね?
0050デフォルトの名無しさん
2007/02/21(水) 01:21:10日本語で例えると、
読点:「,」→「、」
句点:「;」→「。」
てな対応になってる。
0051デフォルトの名無しさん
2007/02/21(水) 01:21:12libtiffからソースをパクって使うってことかね
0052デフォルトの名無しさん
2007/02/21(水) 01:21:140053デフォルトの名無しさん
2007/02/21(水) 01:21:37但し、プリプロセッサディレクティブは文ではない。
0054デフォルトの名無しさん
2007/02/21(水) 01:22:37んなこたあない。
文末を表す記号がセミコロンだ。
0055デフォルトの名無しさん
2007/02/21(水) 01:23:530056デフォルトの名無しさん
2007/02/21(水) 01:25:150057デフォルトの名無しさん
2007/02/21(水) 01:30:34式文→式;
複文→{ 複数の文 }
if文→if (式) 文
while文→while (式) 文
関数定義→いろいろ宣言 文
のように文法的にどういう形になるか決められていて、
それによって;がいるか要らないかは判断できる。
0058デフォルトの名無しさん
2007/02/21(水) 01:31:16>>56
多分それだ。ブロックって言うと・・・例えばどんなのだっけ。
0059デフォルトの名無しさん
2007/02/21(水) 01:43:180061デフォルトの名無しさん
2007/02/21(水) 01:43:44よくない
0062デフォルトの名無しさん
2007/02/21(水) 01:44:22>>57で言うと、複文のこと。
0064デフォルトの名無しさん
2007/02/21(水) 01:50:36例えばこんなのが不自然とかは分かるのか?
if (条件式);
処理;
for (i=0; i<N; i++) {
処理1;
処理2;
};
0065デフォルトの名無しさん
2007/02/21(水) 01:59:53あ、なるほど。さすがにそれはわかる。
要するに文の途中だから;は入れれないとかそういうやつか。
0066デフォルトの名無しさん
2007/02/21(水) 02:06:29ifの方は不自然とかいう問題以前のような気がする。
0067デフォルトの名無しさん
2007/02/21(水) 02:12:260068デフォルトの名無しさん
2007/02/21(水) 02:13:43> 文の途中だから;は入れれない
>>64はどっちも文法上は正しいコードだぞ
0069デフォルトの名無しさん
2007/02/21(水) 02:17:17処理; 普通の文
for (i=0; i<N; i++) { ありがちなN回ループ
処理1;
処理2;
}; ループ後に何もしない処理
0070デフォルトの名無しさん
2007/02/21(水) 02:20:27if (式); は、if (式) 文 の文の部分が;だけからなる空文
if (式) { ... };は、ifに支配されている文は {...} で終わり、そのあとに
if文の次に評価される空文が1つついている解釈になる。
いずれも、文法的には正しい。
式の評価自体に繰り返す意味があって、それ以上実行する必要がある
ものがない場合は、
while (式) ;
のようなループ制御文の文が空文になることも実際にある。
0071デフォルトの名無しさん
2007/02/21(水) 02:22:58while (式)
;
のようにぽつんと単独で目立つように書くのがいい。
0072デフォルトの名無しさん
2007/02/21(水) 02:36:42while (式) ;
}
はwhile (式) ;から}までを繰り返すってこと?
0073デフォルトの名無しさん
2007/02/21(水) 02:40:49while (条件式) {
処理1;
処理2;
…
処理N;
}
条件式が真の間のみ、処理1〜Nを繰り返す
なんか参考書とか買って嫁
0074デフォルトの名無しさん
2007/02/21(水) 02:41:30ブロックの有無は関係ない。while()は次に続く文を実行するだけ。
007536
2007/02/21(水) 03:04:44これは、どんな感じなのか、イメージが掴めないので
例を出して説明して戴けないでしょうか?
>>return num+1;を返しますが、この+1とは・・・?
ご助言、宜しくお願い致します。
0076デフォルトの名無しさん
2007/02/21(水) 03:15:04初期状態では6個登録されているようなのでnum = 6 (呼び出し元ではcal_num == 6)
で、登録して要素が一つ増えたからnum+1 (戻ってきてcal_numが事実上1増えた)
007736
2007/02/21(水) 03:22:44あ〜っ!そういう事だったんですね。
とてもわかり易い説明、ありがとうございました。
あと、幾ら考えてもわからないのが
>>while(1){
printf("食品名(endで計算) : ");
scanf("%s", name);
if(strcmp(name, "end") == 0)
break;
printf("グラム数 : ");
scanf("%f", &gram);
for(i=0; i<num;; i++){
if(strcmp(name, (pcal+i)->name) == 0){
totalcal += (pcal+i)->value * gram / 100.0;
break;
この中の
>>if(strcmp(name, "end") == 0)
>>printf("グラム数 : ");
scanf("%f", &gram);
for(i=0; i<num;; i++){
if(strcmp(name, (pcal+i)->name) == 0){
totalcal += (pcal+i)->value * gram / 100.0;
break;
この二つです、何を言ってるのやらです。
因みに、>>*gramはポインタでなく、"掛ける"ですよね?
0078デフォルトの名無しさん
2007/02/21(水) 03:28:59if(strcmp(name, "end") == 0)
は「nameが"end"だったら」
(pcal+i)->name
は
(*(pcal + i)).name
の略記法であり、結局は
cal[i].name
のこと。
該当するnameのものをforループで探し、
見つかったら( if (strcmp(name, (pcal+i)->name) == 0) )
計算、もう探す必要はないのでbreakする。
007936
2007/02/21(水) 05:02:11m(__)m
0080デフォルトの名無しさん
2007/02/21(水) 06:01:36せっかくポインタ使うんだからむしろこうしたほうがいいかも。
for(i=0; i<num; i++){
if(strcmp(name, pcal->name) == 0){
totalcal += pcal->value * gram / 100.0;
break;
}
pcal++;
}
0081デフォルトの名無しさん
2007/02/21(水) 15:12:41return;
とすると1が戻ってきますが、これはJISとかISOで規定されているのでしょうか?
0082デフォルトの名無しさん
2007/02/21(水) 15:22:090083デフォルトの名無しさん
2007/02/21(水) 15:52:40linuxでwrite()を使ってファイルの書き込みを行なっているのですが、
2G以上のファイルの書き込みを行なおうとハングって落ちちゃいます。
write()では2G以上のファイルは使用できないのでしょうか?
0084デフォルトの名無しさん
2007/02/21(水) 15:57:30どうやってopenしてる?
0085デフォルトの名無しさん
2007/02/21(水) 15:58:460086デフォルトの名無しさん
2007/02/21(水) 16:13:30open()はこんな感じで行なってます。
INT64 fd = open(path, O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR);
0087デフォルトの名無しさん
2007/02/21(水) 16:22:07int main(void)
{
int ch;
FILE *sfp, *dfp;
char sname[64], dname[64]; /* ファイル名 */
printf("コピー元ファイル名:"); scanf("%s", sname);
printf("コピー先ファイル名:"); scanf("%s", dname);
if ((sfp = fopen(sname, "r")) == NULL) /* コピー元をオープン */
printf("\aコピー元ファイルをオープンできません。\n");
else {
if ((dfp = fopen(dname, "w")) == NULL) /* コピー先をオープン */
printf("\aコピー先ファイルをオープンできません。\n");
else {
while ((ch = fgetc(sfp)) != EOF)
fputc(ch, dfp);
fclose(dfp); /* コピー先をクローズ */
}
fclose(sfp); /* コピー元をクローズ */
}
return (0);
}
コピー先のファイルを fileB.c などと拡張子を付けるとうまく生成されません。
拡張子を付けて出力する為にはどのようにすればよいのでしょうか?><
0088デフォルトの名無しさん
2007/02/21(水) 16:24:26#define _LARGEFILE_SOURCE
だったっけ。
0089デフォルトの名無しさん
2007/02/21(水) 16:26:01黙って終わってしまい何もコピーできてないのか、
何かエラーがでるのか、それくらい書いてよ。
009087
2007/02/21(水) 16:29:12これはASCIIコードから操作すべきなのでしょうか?
0091デフォルトの名無しさん
2007/02/21(水) 16:32:02#include <ctype.h>
islower
toupper
009287
2007/02/21(水) 16:34:00拡張子抜きのファイルは確かに作れるんですが、
.txtだとか.c といった風に拡張子を付けると駄目になります。;
エラーは自分で書いた、「コピー先ファイルをオープンできません」が出ます。
009483
2007/02/21(水) 16:38:47>>88
#define _LARGEFILE_SOURCE
は指定しています。
ちょっと調べまして、
#define _FILE_OFFSET_BITS 64
も入れてみましたが結果は変わらずです。(´・ω・`)
0095デフォルトの名無しさん
2007/02/21(水) 16:40:38>>87をコピペしてコンパイルしたけどできたよ。エラーでないよ。
0096デフォルトの名無しさん
2007/02/21(水) 16:41:02errnoでも調べとけよ
0097デフォルトの名無しさん
2007/02/21(水) 16:42:17ファイルを丸ごとプログラムで読み込むようなことをしないで
実行するような方法はないでしょうか?
0098デフォルトの名無しさん
2007/02/21(水) 16:42:44open64とか使わなくていいんだっけ?
0099デフォルトの名無しさん
2007/02/21(水) 16:43:421. ファイル名に出来ない文字を打った ,カンマ と .ピリオド 間違い等(いつもと違うキーボード使ってるなら)
2. ファイル名の長さ制限に引っかかった
010187
2007/02/21(水) 16:48:42>
>ファイルを丸ごとプログラムで読み込むようなことをしないで
>実行するような方法はないでしょうか?
まさかhtmlを埋め込もうとしてる?
0102デフォルトの名無しさん
2007/02/21(水) 16:50:39fopen "a"
0103デフォルトの名無しさん
2007/02/21(水) 16:53:44書き込んだ位置以降を後ろにずらしたいなら移植性の高い方法では多分無理。
010497
2007/02/21(水) 17:06:46データベースを更新したりするようなプログラムを考えてます。
その際に挿入とかがどうしても必要になってきまして;;
>>103
では、諦めた方がいいのでしょうか;
今ところ、
作業ファイルのようなものを仮に作成して、
その中でDBをいじって、
更新するときに、作業ファイルを丸ごと元ファイルに書き込むことを考えてますけど、
これくらいが、一番安定でしょうか?
0105デフォルトの名無しさん
2007/02/21(水) 17:30:52作業ファイルを閉じた後、元ファイル名へ名前を変えるだけでいいと思う。
010697
2007/02/21(水) 17:37:13そうですね そうします
0107デフォルトの名無しさん
2007/02/21(水) 19:51:49ファイルを全部読まなくてもいいんじゃないか?
1バイト読んで作業ファイルに1バイト書いて、というのを繰り返して
20バイト目に来たら作業ファイル側だけに新たな文字列を書いて、
それが終わったらまた1バイトづつ移して最後にクローズしてリネーム。
但し本当にこの通りに1バイトづつやるのであれば fopen(), getc()
putc() でやること。(open(), read(), write() 使わない方が良い。
バッファリングされないから)。
0108デフォルトの名無しさん
2007/02/21(水) 21:32:530109デフォルトの名無しさん
2007/02/21(水) 21:33:440110デフォルトの名無しさん
2007/02/21(水) 21:42:09その定義がライブラリに含まれているという場合もある。
0111デフォルトの名無しさん
2007/02/21(水) 21:47:16ありがとう。でもまだよく分らない(|||´・ω・`)
もうちょっと調べてくる
0112デフォルトの名無しさん
2007/02/21(水) 22:59:23if文では文字列は扱えないのしょうか?
それとも文字列cの最後の\nか\0かに関係がある?
while(1){
char c[10];
printf("exitで終了\n");
fgets(c,sizeof(c),stdin);
if(c == "exit"){
printf("終了します\n");
break;
}
}
0113デフォルトの名無しさん
2007/02/21(水) 23:01:56>if(c == "exit"){
if(strcmp(c,"exit")==0)
か
if(stricmp(c,"exit")==0)
としる
0114113
2007/02/21(水) 23:04:32書き忘れたけど
if(c == "exit") だとポインタの比較であって文字列の比較にならない
strcmp か stricmp で比較する
0115デフォルトの名無しさん
2007/02/21(水) 23:08:230116デフォルトの名無しさん
2007/02/21(水) 23:11:060118デフォルトの名無しさん
2007/02/21(水) 23:16:20if(strcmp(c,"exit\0")==0)
で無事できました。ずっと悩んでたんでかなり助かりました
0119デフォルトの名無しさん
2007/02/21(水) 23:16:41c[strlen(c)-1]='\0';
これで\n消せばいいんじゃね?
0120デフォルトの名無しさん
2007/02/21(水) 23:16:41#include<stdio.h>
#include<string.h>
int main(void)
{
while(1){
char c[10];
char a[10];
printf("exitで終了\n");
fgets(c,sizeof(c),stdin);
sscanf(c,"%s", a);
if(strcmp(a,"exit") == 0){
printf("終了します\n");
break;
}
}
これで上手くいくと思うよ。俺んとこだと、sscanf を sscanf_s にしろと言われるが、
どっちでもいい。
0122デフォルトの名無しさん
2007/02/21(水) 23:24:08ソースの方にはちゃんと\nって打ってた
0123113
2007/02/21(水) 23:31:23そですか
でも strcmp は大文字小文字を区別します
stricmp の方は大文字小文字を区別しませんのれ
EXIT でもおkにするなら stricmp に変える
0124デフォルトの名無しさん
2007/02/21(水) 23:38:140125デフォルトの名無しさん
2007/02/21(水) 23:45:21簡単に説明お願い致します。特にポインタを使った
参照渡しが解説を読んでもピント来ません。
0126デフォルトの名無しさん
2007/02/21(水) 23:55:33ポインタを使ってもアドレスという値を渡してるだけだし。
0127デフォルトの名無しさん
2007/02/21(水) 23:56:43(2)2次元配列データの取り扱い方の欄で
int no[3][4]の図解の説明で、どうして
[0][0]は1 no[1][2]は6で足して7になるのでしょうか?
0128デフォルトの名無しさん
2007/02/22(木) 00:02:52「参照を値渡しする」ことを「参照渡し」と言ってしまう人が多いんだよ。
0129デフォルトの名無しさん
2007/02/22(木) 00:03:18・文系向け
銀行に行きます。値渡しは行員が貸金庫からお金を出してきてくれます。お金を使える事はできても貸金庫内は弄れません。
参照渡しは行員が貸金庫の場所を教えてくれます。中身が何であろうと、どう使おうと自由です。
・理系向け
値渡しが変数のアドレスに格納されている値を関数に渡すのに対し、
参照渡しは変数のアドレスを渡します。アドレス値そのものの書き換えはできなくても
ポインタが指す値や配列などの前後の値を自由に読み書きできます。
実質的にはポインタを渡す場合は、
変数の内容を書き換えしたいときか、配列・文字列を扱うとき、構造体などの大きなデータを渡すとき
などです
0130デフォルトの名無しさん
2007/02/22(木) 00:04:301と6を足したら7だと思うが、どうなると思ったの?
0131デフォルトの名無しさん
2007/02/22(木) 00:05:131+6=7になるからじゃないのかい?
no[0][0]=1;
no[1][2]=6;
no[2][3]=no[0][0]+no[1][2];
の代わりに、
a=1;
b=2;
c=a+b;
でcになぜ7が入るの?って聞いているようなもの。
0132113
2007/02/22(木) 00:05:29Cだと参照渡しできません
>>127
1+6 は 7 ですよ
まぁそんなこと聞きたいわけじゃないと思いますけど
もうすこし、解説読んだほうがいいかと
0133デフォルトの名無しさん
2007/02/22(木) 00:06:43C++では参照という言葉に言語固有の限定した意味があるから、
そこから離れて説明しないといけないぜ。
0134127
2007/02/22(木) 00:06:58このページの図解では、[0][0]は1 no[1][2]は6
何故[0][0] = 1; no[1][2] = 6;なのかがわからないのです
唯単に宣言しているからでしょうか?
0135デフォルトの名無しさん
2007/02/22(木) 00:08:020136113
2007/02/22(木) 00:11:00>>128
あれま
私はてっきり
void func(int &)
がしたいのかと思ったよ
void func(int *)
ってことかね?
>>133
ちょっと面倒ですね
>>134
例、たとえだと思いますよ
別にno[1][0] = 1; no[1][3] = 6; no[0][2]=no[1][0] + no[1][3] 、でも良かったんだと思います
0137125
2007/02/22(木) 00:14:15わかりやすい説明、ありがとうございます
>ポインタが指す値や配列などの前後の値を自由に読み書きできます。
>変数の内容を書き換えしたいときか
これの内容について、更に解説戴けると幸いです。
0138127
2007/02/22(木) 00:16:010139デフォルトの名無しさん
2007/02/22(木) 00:25:42ここはいちおうC言語スレなんで
0141デフォルトの名無しさん
2007/02/22(木) 00:52:56何からはじめたら良い?
0142デフォルトの名無しさん
2007/02/22(木) 00:57:230143デフォルトの名無しさん
2007/02/22(木) 01:00:55本当にやることないからちょっと齧ろうと思うんだけど甘いか?
0144デフォルトの名無しさん
2007/02/22(木) 01:04:46で、面白ければ(多分無い)もしくは嫌いではなければ入門書買うなりなんなりと
0145デフォルトの名無しさん
2007/02/22(木) 01:08:26いや、そんなことはない。
一週間超暇でCの学習に集中するなら、かなり進むことができる。
いい参考文書、いい先達、モチベーションの強固な維持、そして少しのプログラミングセンスがあれば。
0146デフォルトの名無しさん
2007/02/22(木) 01:12:49学生?
なんとなくでも「こんなことしてみたい」って目標があるならまだしも
とりあえず、だと飽きると思うな……
他のプログラミング言語の経験があるなら全く問題なく出来るとは思うけど。
寧ろ、「エクセルでできる〜」とか「エクセルでわかる〜」とかで
遊んだ方が為になることも多いかも試練(スレ違いスマソ
0147デフォルトの名無しさん
2007/02/22(木) 01:13:55おk、適当にやってみる
本当にただの思いつきで今までプログラムなんてやったことないから多分続かないけど
ところでオススメの参考書ってある?
0148デフォルトの名無しさん
2007/02/22(木) 01:16:10一応まだ学生
長い春休みなんだけど遊ぶ人もいないくて暇
どうせだったらこの時間を有意義に使おうとおもって
エクセルからはじめたほうがいいってことかな?
0149デフォルトの名無しさん
2007/02/22(木) 01:18:240150デフォルトの名無しさん
2007/02/22(木) 01:21:22読んでないけど結城浩のC言語プログラミングレッスン2冊あたりは
どうだろうね。
まー、ここにも行ってみそ。
推薦図書/必読書のためのスレッド PART33
http://pc10.2ch.net/test/read.cgi/tech/1167140188/
0151デフォルトの名無しさん
2007/02/22(木) 01:21:46たまたま俺がやってて楽しかったからだw
ttp://www.amazon.co.jp/Excel%E3%81%A7%E9%81%8A%E3%81%B6%E6%89%8B%E4%BD%9C%E3%82%8A%E6%95%B0%E5%AD%A6%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E7%94%B0%E6%B2%BC-%E6%99%B4%E5%BD%A6/dp/4062574306
まあVBAは絶対にオススメしないけど。
マジレスすると、Cやって役に立つような職業よりも
エクセルが役に立つ職種が多い気がする
ただそれだけ。
これまでプログラミング経験が無いんだったら、Cは最初には向かないかもしれん。
http://pc10.2ch.net/test/read.cgi/tech/1075035410/
http://pc10.2ch.net/test/read.cgi/tech/1152778344/
0152デフォルトの名無しさん
2007/02/22(木) 01:25:26マジか
いや遊びまくりたいところなんだけどいつも遊んでた奴がバイトはじめたりなんだかんだで
なんか家でずっと一人でネットばっかやってるのが虚しくなったからさ
>>150
ありがとう、後でじっくり読んでみる
>>151
そうなのか
プログラムっていったらCとかしか聞いたことなかったから解らんかった
初めてやるならなにがいいのかな?
0153デフォルトの名無しさん
2007/02/22(木) 01:30:12やる気があるならC言語が最適
0154デフォルトの名無しさん
2007/02/22(木) 01:36:48みんなありがとう
0155デフォルトの名無しさん
2007/02/22(木) 01:43:43なければ自分で作ります
0156デフォルトの名無しさん
2007/02/22(木) 01:54:550157デフォルトの名無しさん
2007/02/22(木) 02:09:19文字列とポインタがわかりません、説明は読みました
前の変数と配列のポインタは理解できました
>>>10−3.ポインタと文字列
普通ポインタを用いるときには、配列などのアドレスをポインタに設定して用いますが、
文字列の場合には、配列を使わずにメモリ上に取られた文字列のアドレスを
直接ポインタに指定することができます。
これがわかりませんので、解説よろしくお願いいたします。
0158157
2007/02/22(木) 02:15:12ポインタと文字列で
>>>>>>10−3.ポインタと文字列
普通ポインタを用いるときには、配列などのアドレスをポインタに設定して用いますが、
文字列の場合には、配列を使わずにメモリ上に取られた文字列のアドレスを
直接ポインタに指定することができます。
これで、普通の"変数や配列のポインタ"と、"ポインタと文字列 "の違いがわかりませんです。
0159デフォルトの名無しさん
2007/02/22(木) 02:34:05→ ありません。全てアドレス値です。そもそも文字列というのはchar型配列(の先頭のポインタ)
"ABC"みたいのでもメモリ上に変数が作られると考えればいい。文字列は配列なので先頭のポインタを取得すればいい
""で先頭のポインタが取得できるのでポインタ変数にあたかも文字列を代入しているように見える
よってconst char *hoge[N]みたいなので文字列定数の配列が作れます。
0160デフォルトの名無しさん
2007/02/22(木) 02:34:35int *array = { 1, 2, 3, 4, 5 }; // エラー
こういうことはやったらおこられるが、
文字列ならおkとかそういう意味。
char *p = "ABC"; // おk
別にポインタそのものには違いはない。
0161デフォルトの名無しさん
2007/02/22(木) 03:18:34サンクス自分で作る
0162デフォルトの名無しさん
2007/02/22(木) 03:23:01その説明だと、
char *p = "ABC";
*p = 'D';
とか平気でやるようになりそうだ。
0163デフォルトの名無しさん
2007/02/22(木) 03:32:47は前スレの人だな
未だまともな本買わずに、サイトとか見てるのか。
0164デフォルトの名無しさん
2007/02/22(木) 03:46:10それがダメなのはchar *pが暗黙にconstとして宣言されているからですか?
0165157
2007/02/22(木) 03:59:51では、大した違いが無く気にせずでいいんですね。
サンクスでした
>>163
良い本が見つからず、どれを買うか悩んでいます
ここで紹介された本は書店では見当たりません
今のところ、上で挙げたサイトが最良です
0166157
2007/02/22(木) 04:12:50直接ポインタに指定することができます
この解説が
>>>"ABC"みたいのでもメモリ上に変数が作られると考えればいい。文字列は配列なので先頭のポインタを取得すればいい
""で先頭のポインタが取得できるのでポインタ変数にあたかも文字列を代入しているように見える
>>int *array = { 1, 2, 3, 4, 5 }; // エラー
こういうことはやったらおこられるが、
文字列ならおkとかそういう意味。
char *p = "ABC"; // おk
この二つでいいのですよね?
もう一度だけ、例文を用いて解説して戴けると、ありがたいです。
0167デフォルトの名無しさん
2007/02/22(木) 04:13:33その場合の挙動が標準規格で未定義だからです。
0168デフォルトの名無しさん
2007/02/22(木) 05:02:54ありがとうございます。
足を踏み入れてはいけないところに行ってしまったみたいで
ちょっとびびりますた。
0169デフォルトの名無しさん
2007/02/22(木) 06:05:450170デフォルトの名無しさん
2007/02/22(木) 06:09:12OSは?
0171デフォルトの名無しさん
2007/02/22(木) 06:09:340172デフォルトの名無しさん
2007/02/22(木) 06:10:42Win32API質問箱 Build50
http://pc10.2ch.net/test/read.cgi/tech/1171721448/
0173デフォルトの名無しさん
2007/02/22(木) 06:14:540174デフォルトの名無しさん
2007/02/22(木) 11:36:45char name[20]; char name2; int No; int time; char nurupo[10];・・・・
}
みたいな感じでcharやintなんかがごっちゃになってる構造体を
ポインタ操作か何かで
順番に指定していくことってできますか?
0175デフォルトの名無しさん
2007/02/22(木) 11:50:340176デフォルトの名無しさん
2007/02/22(木) 11:58:59>構造体を順番に指定
struct nannka a, b, c;
struct nannka p[] = {&a, &b, &c};
>構造体の要素を順番に指定
struct nannka a;
void * p[] = {a.name, & a.name2, & a.No, & a.time, a.nurupo};
0177デフォルトの名無しさん
2007/02/22(木) 12:13:48ありがとうございます。
早速試させていただきます。
0178デフォルトの名無しさん
2007/02/22(木) 12:22:010179デフォルトの名無しさん
2007/02/22(木) 14:07:52こういう型の異なる構造体のメンバにポインタを使って順番にアクセスする意味があるのだろうか?
結局、そのメンバが文字列なのか整数型なのか判断する必要があるわけだし
名前でアクセスしたほうがソースも見やすいと思うけど
0180デフォルトの名無しさん
2007/02/22(木) 16:19:21sscanf(buff, "%s", buff);
これは反則技ですか?
0181デフォルトの名無しさん
2007/02/22(木) 16:24:40むしろ一般的(?)。これだけで十分だな。最後に\nがくっ付くので注意
0182デフォルトの名無しさん
2007/02/22(木) 16:29:03sscanf(buff, "%s", buff); の方。
同じものにsscanfをしていいのかどうか
0183デフォルトの名無しさん
2007/02/22(木) 16:38:44領域が重なっていると鼻から悪魔
0184デフォルトの名無しさん
2007/02/22(木) 16:49:570185デフォルトの名無しさん
2007/02/22(木) 16:54:47反則技
あぶないコーディング
0186デフォルトの名無しさん
2007/02/22(木) 16:55:38別に buff[strlen(buff)-1] = '\0'; 等でも
やりたい事はできるのだけど、
sscanf使ったらどうなるのかな、って思っただけ。
0187デフォルトの名無しさん
2007/02/22(木) 16:56:55実用上問題ないけど、かなり危険な気がする
でも、その例が思い浮かばない
ループで\nを取り除いたほうがいい気がする
>>184
\nを取り除きたいんじゃないの?
0188デフォルトの名無しさん
2007/02/22(木) 16:59:220189デフォルトの名無しさん
2007/02/22(木) 17:38:36それやるなら
fgets(buff, sizeof(buff), stdin);
sscanf(buff, "%s", command);
でいいんじゃない?
buffは入力データを格納する領域の名称
入力データを加工したらもうbuffではないでしょう
0190デフォルトの名無しさん
2007/02/22(木) 17:58:26httpsの使い方を教えてください
0191デフォルトの名無しさん
2007/02/22(木) 18:19:34目的の環境に合わせて適切なライブラリを入手せよ。
C言語自体には、それらの取り扱いは規定されていない。
0192デフォルトの名無しさん
2007/02/22(木) 22:33:450193デフォルトの名無しさん
2007/02/22(木) 22:38:56#include <time.h>
time_t time(time_t *timer);
0194デフォルトの名無しさん
2007/02/23(金) 00:35:51と
char [10] = "ABC";
char *p;
p = s;
の違いは何なのでしょうか?
0195デフォルトの名無しさん
2007/02/23(金) 00:41:17前者はコンパイルができて後者はエラーになってコンパイルが通らない。
0196194
2007/02/23(金) 00:42:34どうしてなんでしょうか?
同じポインタですよね?
0197デフォルトの名無しさん
2007/02/23(金) 00:44:43↑変数名がないからエラーになる。ポインタは関係ない。
0198デフォルトの名無しさん
2007/02/23(金) 00:46:450199194
2007/02/23(金) 00:47:28char *p = "ABC";
と
char s[10] = "ABC";
char *p;
p = s;
の違いでした。
0200デフォルトの名無しさん
2007/02/23(金) 00:47:290201デフォルトの名無しさん
2007/02/23(金) 00:50:03pの指しているものが文字列リテラルか文字配列かの違い。
0202194
2007/02/23(金) 00:54:10もう少し簡単にお願い致します
”リテラル”、入門書にも載っていません(索引も調べましたが)・・・・
文字列リテラルか文字配列とは・・・?
0203デフォルトの名無しさん
2007/02/23(金) 00:56:410204デフォルトの名無しさん
2007/02/23(金) 00:57:21char *p = "ABC"; ←"ABC"という文字列を指しています。普通はこのポインタを介しての変更はしません。
char s[10] = "ABC";
char *p;
p = s; ←今は"ABC"の入った配列の先頭を指しています。指してる配列の中身を変更できます
0205デフォルトの名無しさん
2007/02/23(金) 00:58:58記憶クラスやらスコープやらの説明をする前に、変数を宣言すると
メモリ上に型に応じた領域が確保されるというのをちゃんと教えて
くれないといかん。
あと、初期値の設定なんて0/NULLにしておくくらいしか普通使わなく
ないか?
0206194
2007/02/23(金) 01:07:15>>204
>>205
ありがとうございます
char s[10] = "ABC";
char *p;
p = s;
は、a[0] A を指していて
char *p = "ABC"; pの中に"ABC"が入るって事でしょうか?
0207デフォルトの名無しさん
2007/02/23(金) 01:12:00あくまで"ABC"っていう文字列リテラルの先頭を指しているだけで、
中に入っているわけじゃない。
こういうのって実行時にプログラムが、どんな風に展開されてるかを
イメージできないと理解しにくいんでない?
0208デフォルトの名無しさん
2007/02/23(金) 01:15:05ヒープにおかれた "ABC" の先頭アドレスが p に代入される。
char s[10] = "ABC"; だと、
スタックに s がつまれ、"ABC" で初期化される。
0209デフォルトの名無しさん
2007/02/23(金) 01:15:28(こいつだめだ・・・まるでわかってない・・・俺が教えてやんよ!)
前者はそんな感じ(中身のAを指してるわけじゃないが)
後者は例えば文字列リテラルという型LITERALがあったとしよう。
char *p = "ABC";っていうのはいわば前者と同じ感じで
LITERAL lite = "ABC"
char *p = &lite; //&liteはアドレス
こんな感じで、配列だろうと文字列リテラルだろうとメモリ上にあるからアドレスがあるわけだ
0210194
2007/02/23(金) 01:16:53難しいです、というかイメージが付きにくいです
>>文字列リテラルの先頭を
は"ABC"の{'A',B',C,','\0'};リテラルの先頭とは
\0←を指しているのでしょうか?それとも'A'でしょうか?
0211デフォルトの名無しさん
2007/02/23(金) 01:18:570212デフォルトの名無しさん
2007/02/23(金) 01:18:59矢印に 'A' が入るんじゃない。
矢印のさしている先に 'A' があるんだよ。
0213デフォルトの名無しさん
2007/02/23(金) 01:19:210214デフォルトの名無しさん
2007/02/23(金) 01:19:590215デフォルトの名無しさん
2007/02/23(金) 01:28:190216デフォルトの名無しさん
2007/02/23(金) 01:30:56堂々とした間違い。
0217デフォルトの名無しさん
2007/02/23(金) 01:31:54int か double か
0218194
2007/02/23(金) 01:32:10ヒープやスタック、とか説明が高度で付いていけません
双方共に同じ先頭を指してるのに何が違うのかイメージがつかないです
もう一度だけ>>char s[10] = "ABC"; だと、
スタックに s がつまれ、"ABC" で初期化される。
の>>スタックに s がつまれ、"ABC" で初期化される。
というのを解説お願い致します。
あとは出直してきます
0219デフォルトの名無しさん
2007/02/23(金) 01:33:27int abs(int);
double fabs(double);
0220デフォルトの名無しさん
2007/02/23(金) 01:34:02そこ間違ってるから気にする必要はない
0221194
2007/02/23(金) 01:34:36ヒープやスタック、とか説明が高度で付いていけません
双方共に同じ先頭を指してるのに何が違うのかイメージがつかないです
もう一度だけ>>char s[10] = "ABC"; だと、
スタックに s がつまれ、"ABC" で初期化される。
の>>スタックに s がつまれ、"ABC" で初期化される。
というのを解説お願い致します。
あとは出直してきます
0222194
2007/02/23(金) 01:35:18ありがとうございました、出直してきます
0223デフォルトの名無しさん
2007/02/23(金) 01:38:01分解して考えると分かるかも
char s[10] = "ABC";は
char s[10];
strcpy(s, "ABC");
この場合は、char s[10]の領域の内容を s[0]='A' s[1] = 'B' s[2]='C' s[3]='\0' s[4]〜以下不定
で初期化。
char *p = "ABC";
これを分解すると
char *p;
p = "ABC";
こうすれば、pは単なるポインタだってわかるはず。"ABC"はコンパイル時に
プログラム(exeファイルとか)内のどこかにおかれる文字列定数の先頭
のアドレスの意味になる。
022436
2007/02/23(金) 02:12:00どのことでしょうか?要素とは何でしょうか?
0225デフォルトの名無しさん
2007/02/23(金) 02:29:08"米飯", 150.3 ←要素
"中華麺", 57.1 ←要素
"蕎麦", 133.3 ←要素
"うどん", 100.0 ←要素
"素麺", 133.3 ←要素
"食パン", 250.3 ←要素
要素数=6
022636
2007/02/23(金) 02:45:37さんkすです!
要素だから[]だと思っていました
0227デフォルトの名無しさん
2007/02/23(金) 04:10:56それとも構造体配列でないとポインタは使えないでしょうか?
0228デフォルトの名無しさん
2007/02/23(金) 04:22:18022936
2007/02/23(金) 04:35:43CALORIE cal[500] = {
{"米飯", 150.3}, {"中華麺", 57.1}, ←アドレス:1000: cal[0]
{"蕎麦", 133.3}, {"うどん", 100.0}, ←アドレス:1001: cal[1]
{"素麺", 133.3}, {"食パン", 250.3} ←アドレス:1002: cal[3]
};
なのでしょうか?
或いは、これら全体でアドレス:1000: cal[0]なのでしょうか?
{"米飯", 150.3}, {"中華麺", 57.1},
{"蕎麦", 133.3}, {"うどん", 100.0},
{"素麺", 133.3}, {"食パン", 250.3}
}
023036
2007/02/23(金) 04:45:12{"米飯", 150.3}, ←アドレス:1000: cal[0]
{"蕎麦", 133.3}, ←アドレス:1001: cal[1]
{"素麺", 133.3}, ←アドレス:1002: cal[3]
{"中華麺", 57.1}, ←アドレス:1003: cal[4]
{"うどん", 100.0}, ←アドレス:1004: cal[5]
{"食パン", 250.3} ←アドレス:1005: cal[6]
0231デフォルトの名無しさん
2007/02/23(金) 04:51:100232デフォルトの名無しさん
2007/02/23(金) 04:54:46ポインタに代入することが出来る。
指しているのはcalの先頭要素。
ポインタに加減算をすることで次/前の要素をポイントできる。
023336
2007/02/23(金) 05:06:020234デフォルトの名無しさん
2007/02/23(金) 05:09:160235デフォルトの名無しさん
2007/02/23(金) 05:10:52023636
2007/02/23(金) 05:22:03では違っているのでしょうか?
>>235
え?そうなんですか?
ポインタはアドレスが重要と思っていましたが
では、アドレスでなくインデックス番号を重視すべきですかね?
0237デフォルトの名無しさん
2007/02/23(金) 05:37:31実現するためにCではアドレスという機械寄りの概念を露出させ
てしまっているだけ。Pascalではもっと抽象化されているし、ポ
インタ=アドレスという理解だとJavaにはポインタがないという勘
違いも生む。
場所さえ指せればよいのだから、使い手にとっては、それがメモリ
上のアドレス値であるというのは余計な情報。
023836
2007/02/23(金) 05:41:47初めてのプログミングがCだったのが間違いでしたかね
Javaの方が簡単と聞きますし
0239デフォルトの名無しさん
2007/02/23(金) 05:43:37○「Cではポインタをデータのあるメモリ上のアドレスとして表現している」
と理解してればいいんじゃね?
0240デフォルトの名無しさん
2007/02/23(金) 05:49:550241デフォルトの名無しさん
2007/02/23(金) 06:11:30CALORIE *hoge=cal; int i; for(i=0;i<cal_num;i++){printf("%6s(%3.0f) %p\n",hoge->name,hoge->value,hoge);hoge++;}
(int mode = 0; の直後)
で、表示されたモノは一旦忘れてw
真面目な話、例として↑のコードで
CALORIE *hoge(CALORIE型のポインタ)はメモリのどこかに格納されているデータ、CALORIE型の変数(配列)にアクセスできる。
この場合、最初に設定されているアクセス先は配列cal[500]の先頭(つまり要素cal[0])で、
hoge++ で、次々とcal[1], cal[2], cal[3] ... とアクセスして表示している。
冗談で %p で番地を表示しているけど、実際のコーディングでこのアドレスを意識する必要性は無い(と思う
と偉そうに言う俺もほぼ初級者。。。
0242デフォルトの名無しさん
2007/02/23(金) 07:16:17{
char a[4] = "ABC";
char *p = "ABC";
printf("&a = %p\n", &a);
printf("a = %p\n", a );
printf("&a[0] = %p\n", &a[0]);
printf("\n");
printf("&p = %p\n", &p);
printf("p = %p\n", p);
printf("&p[0] = %p\n", &p[0]);
return(0);
}
// 3つとも配列aの先頭アドレス
&a = 0x22cce4
a = 0x22cce4
&a[0] = 0x22cce4
&p = 0x22cce0 // ポインタ変数pのアドレス
p = 0x402000 // ポインタ変数pの値
&p[0] = 0x402000 // "ABC"が格納されている場所の先頭アドレス=ポインタ変数pの値
0243デフォルトの名無しさん
2007/02/23(金) 07:25:55そう書くと&a、a、&a[0]どれも同じに見えてしまう。
0244デフォルトの名無しさん
2007/02/23(金) 09:34:35リテラル使って初期化したら初心者には余計わかりづらいと思うんだが。
0245デフォルトの名無しさん
2007/02/23(金) 12:33:20&a、a、&a[0]は、どれも同じ。
a も p も表示させるとアドレスだが、a は配列aの先頭アドレスであって、
&a の示すアドレスに0x22cce4というアドレスが格納されているのではない。
そのため、a = p という代入はできない。
一方で、p は変数pのアドレスではない。
&p の示すアドレスに0x402000というアドレスが格納されている。
この0x402000は "ABC" というデータが格納されている領域の先頭アドレスに
なっている。
変数p にはアドレスを格納できるので、p = a という代入はできる。
0246デフォルトの名無しさん
2007/02/23(金) 12:37:12間違ってるぞ
0247デフォルトの名無しさん
2007/02/23(金) 12:57:00間違ってるとは言えない
0248デフォルトの名無しさん
2007/02/23(金) 13:02:59型が違う。
p = &a と代入すると警告が出るはず。
0249デフォルトの名無しさん
2007/02/23(金) 14:26:12#include <stdlib.h>
#include <time.h>
#define MAX_LINE 79
void main(void)
{
char s[] = "0123456789"
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"[]@;:-+*^~|_,.\\/\"\'%%$#&()!";
char ps[MAX_LINE];
int si = sizeof(s);
int i;
srand(time(NULL));
for( i = 0; i < MAX_LINE; i++ )
ps[i] = s[rand() % si];
printf(ps);
}
なんとなく思いつきでランダムな文字列を79個配列にコピーして
それを表示するプログラム作ってみたんですが、実行する毎に79文字表示されなかったり
エラーが出たりします。
間違いを教えて頂けないでしょうか?
0250デフォルトの名無しさん
2007/02/23(金) 14:37:2779文字表示されないのはs[si-1]が'\0'だから。
0251デフォルトの名無しさん
2007/02/23(金) 14:40:13printf("%s", ps);
でやってみ
0252デフォルトの名無しさん
2007/02/23(金) 14:41:17rand() % si のとりうる範囲は[0,sの文字列長+1]
よって ps[i] の途中に ¥0 が入る可能性がある。
0253デフォルトの名無しさん
2007/02/23(金) 14:42:52「¥0 までの」ってのは「¥0 を含んだ」ね。
素直にstrlen使おう。
0254デフォルトの名無しさん
2007/02/23(金) 14:43:440255デフォルトの名無しさん
2007/02/23(金) 14:47:53ご丁寧にありがとうございます。
エラーは例の「ご迷惑をおかけして(ry」のヤツです。
NUL文字について忘れてました。
0256デフォルトの名無しさん
2007/02/23(金) 15:08:53unsigned long a ;
if( a>>31 & 1 == 1 )やif( a>>31 & 1 !=0 )
とすれば、aの31ビット目が1であるかどうか判定できますでしょうか?
0257デフォルトの名無しさん
2007/02/23(金) 15:35:090258デフォルトの名無しさん
2007/02/23(金) 15:35:20何でそんな質問に到ったのかわからんので想像で答えるが
演算子の優先順位に注意
0259デフォルトの名無しさん
2007/02/23(金) 16:24:17==1はいらないんじゃないすか、と主観で語ってみる。
0260デフォルトの名無しさん
2007/02/23(金) 21:55:40026136
2007/02/24(土) 00:25:43/************************************
calregist() カロリーリストへ登録する
[引数] pcal -- カロリーリストへのポインタ
num -- 登録前のリストの要素数
[戻り値] 登録後のリストへの要素数
*************************************/
これの
>>calregist() カロリーリストへ登録する
カロリーリストとは
{"米飯", 150.3}, {"中華麺", 57.1},
{"蕎麦", 133.3}, {"うどん", 100.0},
{"素麺", 133.3}, {"食パン", 250.3}
これであっていますよね?
0262デフォルトの名無しさん
2007/02/24(土) 00:26:17以下のようにコーディングしたら先輩からそんな糞コードかくなと怒られてしまった。
実際はもっと条件が複雑で、逆の条件を考えるのが億劫だったからこうしたんだけど
やっぱりダメですか?
if (a == 1 || a == 2 || a ==3)
{
/* 何もしない */
} else {
/* エラー */
return 1
}
正常の場合、処理が続く
0263デフォルトの名無しさん
2007/02/24(土) 00:32:05全体を !() でくくればいいだけじゃね
0264デフォルトの名無しさん
2007/02/24(土) 00:34:40カロリーリストはこの場合はCALORIE cal[500]だと思われ。{"米飯", 150.3},(ryもその一部
日本語に惑わされずに順に追ってけば分かると思うが
>>262
if (A != 1 || A != 2 || A !=3)
{ /* エラー */
return 1;
}
0265デフォルトの名無しさん
2007/02/24(土) 00:36:35if (A != 1 && A != 2 && A !=3)
{ /* エラー */
return 1;
}
0266デフォルトの名無しさん
2007/02/24(土) 00:38:55誰もそんなこと聞いてないと思うが
0267デフォルトの名無しさん
2007/02/24(土) 00:53:210268デフォルトの名無しさん
2007/02/24(土) 01:07:35if(A<1 || 3<A)
でいいんじゃないか
0269デフォルトの名無しさん
2007/02/24(土) 01:08:540270デフォルトの名無しさん
2007/02/24(土) 01:14:03じゃあ書いたら
思い浮かばない?
0271デフォルトの名無しさん
2007/02/24(土) 01:20:09先輩の言うことは聞いとけ。
っていうかその程度の条件が億劫ってやヤバすぎだろ。
0272262
2007/02/24(土) 01:21:31一応、独自のコーディングルール!?に引っかかって使えないのですよね。
なんとか正しい条件は書けて、テストも上手くいったけど
何度条件判定見直しても、わけわかんねって感じです。
既存のコードの修正なんで、ロジックも変にいじれないしつらい・・・
0273デフォルトの名無しさん
2007/02/24(土) 01:30:43( (a < 4 || a > 5 && a % 6) && g(a) )
の否定は?って聞かれて正しい答えが2,3秒で思い浮かぶならいいけどさ。
そうじゃなければ、エンバグのもとになるんじゃないかな。
0274デフォルトの名無しさん
2007/02/24(土) 05:29:55コメントはアレだけど。
0275デフォルトの名無しさん
2007/02/24(土) 05:37:56後学のために>>265のどの辺がどう糞コードなのか教えて欲しい。
おれにはそうは見えないのだが。
0276デフォルトの名無しさん
2007/02/24(土) 05:41:21//処理1
}
else if (a == 2) {
//処理2, 3略
}
else {
//鰓
return 1
}
良く分からんけど、こういう処理をするんじゃないの?
(switch使っても一緒?
0277デフォルトの名無しさん
2007/02/24(土) 05:46:580278デフォルトの名無しさん
2007/02/24(土) 05:57:520279デフォルトの名無しさん
2007/02/24(土) 06:06:59これは誰がどう見ても、
if (A == 1 || A == 2 || A == 3) 正常;
だよな。でだ。
if (A != 1 && A != 2 && A != 3) 異常;
と書いてあったらそれが
>Aが1、または2または3の場合、正常それ以外は異常という判定
だと瞬時に判断できるか?
条件の部分がもっと複雑だったらどうする? 一々ドモルガンの定理でひっくり返すのか?
>Aが1、または2または3の場合、正常それ以外は異常という判定
だけしか書いてなくて、Aが整数かどうか判らないのだから>268でいいかどうかも判らないしな。
0280デフォルトの名無しさん
2007/02/24(土) 08:15:58int num;
num=(int)str;
コンパイルは通るのですがうまくキャストされてません。
※if(num==123)がfalseになる
strは毎回あたいが変わるものとしてどうしたらいいでしょうか?
0281デフォルトの名無しさん
2007/02/24(土) 08:53:34整数でないならますます>>268みたいに判別すべきじゃないのか?
0282デフォルトの名無しさん
2007/02/24(土) 09:26:29値のリストが膨大でも?
>>280
キャストでは無理。atoi()か、できればstrtol()を使え。
0284デフォルトの名無しさん
2007/02/24(土) 09:58:20メモリ領域確保しながら読み込む事を考えています。
(1)と(2)とではどちらが一般的なルーチンなのでしょうか?
(今(1)なのですが、野暮ったい感じがします・・)
(1)
100行分領域確保
ループ{
10行毎に領域確保
ファイル1行読込
}
(2)
ループ{
もしループ初回なら100行分領域確保
10行毎に領域確保
ファイル1行読込
}
0285デフォルトの名無しさん
2007/02/24(土) 10:16:36#include <stdio.h>
#include <math.h>
int main(void)
{
char str[256] = "123";
int num, len, tmp, i;
tmp = *(int *)str; len = strlen(str); num = 0;
for (i=0; i<len; i++)
num += ((tmp >> i*8) & 0xFF - '0') * (int)pow(10, (double)(len-1-i));
printf("%d\n", num);
return(0);
}
0286デフォルトの名無しさん
2007/02/24(土) 10:19:12charの配列を宣言したとき、その変数はポインタになる。
num=(int)str;
↑つまりこれはnumに文字列"123"へのアドレスをint型として代入しただけ。
そもそもCでは代入演算子を使って文字列を一気に変数ぶち込む、というのが出来ない。
>>282の言うとおりatoiあたりを使うしかない。自分で関数作ってもいいけど。
>>284
その辺は個人のコーディングスタイルの問題じゃなかろうか。
個人的には1の方が見やすい。
0287デフォルトの名無しさん
2007/02/24(土) 11:21:14野暮ったく思う理由は?
別に(1)でいいと思うけど。
#領域確保が関数化されていなくて複雑な手順だというのなら、(2)の方がましだが……
>>285
勘弁してくれ。
0288デフォルトの名無しさん
2007/02/24(土) 11:38:50>>287
野暮ったいというのは、(2)のループ内の領域確保部分を関数化
した方が見やすいかと思ったからです
でも面倒になってきたんで(1)で行きます
ありがとうございました
0289デフォルトの名無しさん
2007/02/24(土) 11:51:13関数化したなら、その関数を(1)の形で呼ぶだけでいいじゃん。
0290デフォルトの名無しさん
2007/02/24(土) 11:55:00ループの先頭で初回にしか分岐しない条件入れるのって気持ち悪くない?
0291デフォルトの名無しさん
2007/02/24(土) 11:55:10bufsize=256文字分領域確保
ループ{
ファイル1字読込
bufsize文字になったらbufsize+256文字分に領域拡大
push(...);
}
push(...)
{
もし1行目ならdatasize=100行分領域確保
datasize行になったらdatasize+10行分に領域拡大
1行追加
}
0292デフォルトの名無しさん
2007/02/24(土) 12:14:12ゼロ除算を避ける方法ですが、分母 a が int 型の整数なら、
a==0 のときだけ場合分けすれば問題なしです。
分母 a が double 型のときはどうなのでしょうか?
a==0.0 のときだけ場合分けすればよろしいのでしょうか?
同じ 0 でも、0.0+1e とか 0.0+10e とかありそうで不安です。
0293デフォルトの名無しさん
2007/02/24(土) 12:16:210294デフォルトの名無しさん
2007/02/24(土) 12:25:280295デフォルトの名無しさん
2007/02/24(土) 12:37:57gcc(mingw) の include ディレクトリの中を grep で捜したけど無いぞ
どのファイルに書かれているのかkwsk
0296デフォルトの名無しさん
2007/02/24(土) 12:43:210297デフォルトの名無しさん
2007/02/24(土) 12:47:460298デフォルトの名無しさん
2007/02/24(土) 12:53:40俺の環境では include/c++/3.4.2/limits にあったが
0299デフォルトの名無しさん
2007/02/24(土) 12:57:58スレタイ嫁
0300295
2007/02/24(土) 13:05:36そこにもなかった
return __DBL_EPSILON__;
と書いてある行はあったが定義の場所が不明
Borland C++ Compiler ver5.5 なら float.h に DBL_EPSILON の定義が書いてあった
0301デフォルトの名無しさん
2007/02/24(土) 13:17:54中のぞいてみれば分るが、君がmingwのincludeディレクトリだと信じている
ディレクトリの中のfloat.hは#include_nextで別のところのfloat.hを読んでるはずだ。
0302デフォルトの名無しさん
2007/02/24(土) 13:24:38include\..\lib\gcc\mingw32\3.4.2\include\float.h
にあったよ
0304デフォルトの名無しさん
2007/02/24(土) 16:27:48==0.0の時でいいんじゃね?それは実際の表記であって値は同じじゃね?
0305デフォルトの名無しさん
2007/02/24(土) 16:40:420306デフォルトの名無しさん
2007/02/24(土) 16:46:00浮動小数点の0除算は正負のInfかNaNが返るだけだから、そんなことする必要なくね?
0307デフォルトの名無しさん
2007/02/24(土) 16:48:16どこが判らんの?
0308デフォルトの名無しさん
2007/02/24(土) 16:54:56人間イプシロンの機械版だよ
0310268
2007/02/24(土) 17:59:16>Aが1、または2または3の場合、正常それ以外は異常という判定
>だけしか書いてなくて、Aが整数かどうか判らないのだから>268でいいかどうかも判らないしな。
だから「整数なら」って書いたんだけど
0311デフォルトの名無しさん
2007/02/24(土) 18:03:260312デフォルトの名無しさん
2007/02/24(土) 19:54:53その添字を返し、含まれていなければ-1を返す関数
int str_char(const char str[], int c) {}
を作成せよ。
のint cってchar cではないんでしょうか?
0313デフォルトの名無しさん
2007/02/24(土) 20:24:09標準関数では、古いCとの互換性などの観点から引き数にintより小さい型は使わない。
それに倣ったか深く考えてないか、その辺だろ。
0314デフォルトの名無しさん
2007/02/24(土) 20:36:16どもです。
う〜ん仕様変えるのはアレなのでこのまま頑張りますか…
0315デフォルトの名無しさん
2007/02/24(土) 20:44:33unsigned char か int
0316デフォルトの名無しさん
2007/02/24(土) 20:53:07ありがとうございます。それでやってみます〜
0317デフォルトの名無しさん
2007/02/25(日) 01:43:38ウィンドウを作りたいんですが、なにを勉強すればいいんでしょうか?
オススメの書籍、サイトありましたら教えてください
0318デフォルトの名無しさん
2007/02/25(日) 02:03:510319デフォルトの名無しさん
2007/02/25(日) 02:35:08いわゆるpetzold本しかないんじゃね?
「プログラミングWindows」という本だ。
amazonとかで探してみれ。
ただし、期待しているものとは違っている可能性がある。
0320デフォルトの名無しさん
2007/02/25(日) 02:39:07そういや見たことないや
0321デフォルトの名無しさん
2007/02/25(日) 02:41:04このページの、【2.アドレス渡し】の下図で
seito2[0] 1000番
seito2[1] 1001番
seito2[2] 1002番
なのでしょうか?
0322デフォルトの名無しさん
2007/02/25(日) 02:57:27seito2[1] は
seito2[0] のアドレス + sizeof(seiseki) (場合によってはさらに詰め物)
のとこにある。
0323デフォルトの名無しさん
2007/02/25(日) 02:59:51る(拡大される)ので、
seiseki* p = &seito2[0];
なときに
p + 1 == &seito2[1];
となる。つまりは、
*(p + 1) == seito2[1];
というか配列という記法は上のような式の左辺を見やすくするための
便法でしかない。
0324デフォルトの名無しさん
2007/02/25(日) 03:04:28http://www9.plala.or.jp/sgwr-t/c/sec10-2.html
では、配列とポインタと同じ事でしょうか?
となると
seito2[0] 1000番
seito2[1]
seito2[2]
seito2[1]
seito2[2]
のアドレスは幾つになるのでしょうか?
0325デフォルトの名無しさん
2007/02/25(日) 03:09:10- CPUが何か
- sizeof(seiseki) がいくつになるか
(単純に構造体のメンバーのサイズの合計とはならない可能性がある)
によって違う。
0326デフォルトの名無しさん
2007/02/25(日) 03:15:57seito2[0] 1000番
seito2[1] 1000+size番
seito2[2] 1000+size*2番
0327デフォルトの名無しさん
2007/02/25(日) 03:26:39テストを受けた人間の情報を管理する為に、個別に個人情報紙(構造体)を作りました。
個人情報紙(構造体)には"テストの成績番号""名前""点数"を書く事にしました。
今回のテストの情報用紙を束ねた物には、seito2という名前を付け管理する事にします。
では、seito2を束ねた順に横に並べてみましょう。
この並べ始めた地点をseito2[0]と呼ぶ事にします。
次は当然seito2[1] その次はseito2[2] になります。
用紙のサイズは全部同じにしてあるので
用紙のサイズ * 見たい生徒の番号(何番目に並べたか) で見付ける事も出来ます。
なんかめんどくなった。
見てわからんなら実際にメモ用紙にでも書いて並べてみれ
0328デフォルトの名無しさん
2007/02/25(日) 03:26:40では、CPUなどによって違うのですね
ありがとうございました。
0329デフォルトの名無しさん
2007/02/25(日) 04:34:32そこのサイト学生番号とアドレスの数字が近すぎてよくないな。
本来無関係なのに数字同士が近いと初心者が勝手に関連づけることはよくあるから。
0330デフォルトの名無しさん
2007/02/25(日) 04:42:09Linuxで以下の条件コンパイルができました。
(gcc -DDEBUG1 ファイル名 などでコンパイルが通る)
#if (DEBUG1 || DEBUG2)
・・・
#endif
これは
#if defined(DEBUG1) || defined(DEBUG2)
・・・
#endif
と等価ということでしょうか?
0331デフォルトの名無しさん
2007/02/25(日) 05:10:18-DDEBUG1でやってみたら?
#include <stdio.h>
int main()
{
#if (DEBUG1 || DEBUG2)
printf("hello %d\n", DEBUG1);
#endif
return 0;
}
0332デフォルトの名無しさん
2007/02/25(日) 05:10:270333デフォルトの名無しさん
2007/02/25(日) 05:23:08違う。
#define DEBUG1 0
#define DEBUG2 0
で両者の動作を比較してみな。
0334デフォルトの名無しさん
2007/02/25(日) 05:33:33という質問するからにはWindows限定で良いんだろうから
(1) 窓の生成からメッセージレベルまで全部操作したい → Win32API
(2) C++&既製ライブラリでWin専用アプリをバリバリ作り倒したい → MFC(Visual C++ 6 or .NET使用)
(3) 今後の.NETの展開に期待しつつ、簡単にGUI開発したい → C# (Visual C#)
Visual Studio .NET(有料)なら全部可
BCC5.5forWin なら、(1)のみ可
http://pc10.2ch.net/test/read.cgi/tech/1171721448/
http://pc10.2ch.net/test/read.cgi/tech/1171389245/
http://pc10.2ch.net/test/read.cgi/tech/1152778344/
俺の独断だし勘違いあるかもしれんけど
環境依存ネタはスレ違いなので、以下は該当スレで……
0335デフォルトの名無しさん
2007/02/25(日) 05:57:58ありがとうございます
APIを勉強してみます
0336デフォルトの名無しさん
2007/02/25(日) 06:57:46結論、そのサイトはあなたの学習にとって、著しく遠回りを強いているということですね。
0337デフォルトの名無しさん
2007/02/25(日) 07:09:51確かに。
無料サイトだけで理解できたならそれで良いかもしれんが、
実際>>324はそこのページとかで悩み続けて徒に時間を浪費してるわけで
ちょっと分厚い参考書読むとか、視点を変えてPCアーキテクチャをちょびっと学ぶとか
色々あるだろうに。
もし、このスレの頭の方からポインタについて質問し続けてる人だったら
ホント他のやり方で学んだほうが良いんじゃないかと
0338デフォルトの名無しさん
2007/02/25(日) 09:57:23素直に本買えと
0339デフォルトの名無しさん
2007/02/25(日) 10:29:470340デフォルトの名無しさん
2007/02/25(日) 12:45:401 + n == 1 が成り立たない最小の n > 0 だったかと。
機械イプシロンより小さい値を足しても、
精度が足りなくて 1 のまんま。
0341デフォルトの名無しさん
2007/02/25(日) 13:04:591.0 + DBL_EPSILON != 1.0
2.0 + DBL_EPSILON == 2.0
2.0 + 2 * DBL_EPSILON != 2.0
n が1より大きい場合は該当の値も機械イプシロンより大きくなると
思っていいのかな。
0342デフォルトの名無しさん
2007/02/25(日) 14:19:01ほら、あんたの後ろに。
0343デフォルトの名無しさん
2007/02/25(日) 17:21:32/ ::::::::::::::::\ つ
. | ,,-‐‐ ‐‐-、 .:::| わ
| 、_(o)_,: _(o)_, :::|ぁぁ
. | ::< .::|あぁ
\ /( [三] )ヽ ::/ああ
/`ー‐--‐‐―´\ぁあ
0344デフォルトの名無しさん
2007/02/25(日) 19:25:16思っていいけど、連続的に変化する訳じゃなくて、
もっと離散的に変化すると思われる。
0345デフォルトの名無しさん
2007/02/25(日) 22:50:240346デフォルトの名無しさん
2007/02/25(日) 22:59:011.0000000000000000000000000000000000000000000000000000e+00000000000
+.0000000000000000000000000000000000000000000000000001e+00000000000
-------------------------------------------------------------------
1.0000000000000000000000000000000000000000000000000001e+00000000000
↑↓同じイプシロン
1.0000010101010101010101010101010111101011010001110110e+00000000000
+.0000000000000000000000000000000000000000000000000001e+00000000000
-------------------------------------------------------------------
1.0000010101010101010101010101010111101011010001110111e+00000000000
↑↓違うイプシロン
1.0000000000000000000000000000000000000000000000000000e+00000000001
+.0000000000000000000000000000000000000000000000000001e+00000000001
-------------------------------------------------------------------
1.0000000000000000000000000000000000000000000000000001e+00000000001
0347デフォルトの名無しさん
2007/02/25(日) 23:52:22>>331
-DDEBUG1 で、たまたまDEBUG1が0ではなかっただけでした。
てっきりゼロのマクロかと思ってたのでprintがコンパイル対象になってるのが
疑問でした。
>>333
下は定義されていればそれだけで真ということですね。これからは
-DDEBUG1=0 -DDEBUG1=1 とかでコンパイルすることにします。
0348デフォルトの名無しさん
2007/02/26(月) 00:09:38マニュアルに書いてあることなんで、(ry
0349デフォルトの名無しさん
2007/02/26(月) 01:12:38int func1 (void){
return 10;
}
main(){
int d;
d = func1();
printf("%d\n", d);
return 0;
}
どうして、10になるのかわかりません
これは、int d; に10は代入されていないのに・・・・
0350デフォルトの名無しさん
2007/02/26(月) 01:17:21func1()の戻り値は10なのでdに10を代入してることになる。
0351デフォルトの名無しさん
2007/02/26(月) 01:25:25わかりにくかったら関数を変数と同じように考えるといい。でその値はreturn文で決まると
このような記述が出来ないとそもそも関数の戻り値が利用出来ない。
if文での条件式に関数そのものがif(func(hoge))みたいに使われることも多々ある。
0352349
2007/02/26(月) 01:29:52もう少し簡単にお願い致します。。。
>>351
>>わかりにくかったら関数を変数と同じように考えるといい
>>349のソースを使い例をお願いします。
0353デフォルトの名無しさん
2007/02/26(月) 01:30:100354デフォルトの名無しさん
2007/02/26(月) 01:40:18データの型がchar型やfloat型やint型が混在している場合は
どのように配列を作成するのが好ましいのでしょうか。
ご教授お願いします。
0355デフォルトの名無しさん
2007/02/26(月) 01:48:37VBを使う
0356デフォルトの名無しさん
2007/02/26(月) 01:54:37関数は終了時に return で値を返す事が出来る。
func1 の return に注目。
そして、d = func1() は func1 が返した値を入れている。
他にも出来る事はあるけど、今はこの使い方を理解しよう。
func1 を手本に新たに func2 を作って d = func2 にしてみれ。
0357デフォルトの名無しさん
2007/02/26(月) 01:55:49すまんが、何を言いたいのか分からん…
0358デフォルトの名無しさん
2007/02/26(月) 01:58:12variant型をよこせと…
0359デフォルトの名無しさん
2007/02/26(月) 02:09:530360デフォルトの名無しさん
2007/02/26(月) 02:11:20メモリが勿体無いがdoubleで配列作ってに格納する時にdoubleにキャストする
>>352
考え方・理解の仕方ってだけで実際に変数になるわけじゃないからな
何歳か知らんが数学やったのなら>>349はy=f(x)と同じ状態だな
0361デフォルトの名無しさん
2007/02/26(月) 02:12:37で、使うときにどのメンバを使っていいのか間違えて NaN
0362デフォルトの名無しさん
2007/02/26(月) 02:16:27enum {
t_empty,
t_double,
t_int,
t_char
} type;
union {
double v_double;
int v_int;
char v_char;
} value;
} variant_t;
int main() {
variant_t data[] = {
{ t_empty},
{ t_double, { .v_double = 2.3 } },
{ t_int, { .v_int = 42 } },
{ t_char, { .v_char = '!' } },
};
for(int i = 0; i < sizeof(data)/sizeof(*data); ++i) {
if((data+i)->type) switch((data+i)->type) {
case t_double: printf("%d: double(%f)\n", i, (data+i)->value); break;
case t_int: printf("%d: int(%d)\n", i, (data+i)->value); break;
case t_char: printf("%d: char(%c)\n", i, (data+i)->value); break;
}
}
}
0363デフォルトの名無しさん
2007/02/26(月) 02:21:48釣られてやるのも適当にしよーよー
0364デフォルトの名無しさん
2007/02/26(月) 02:52:11data[0] = variant(char, 'A');
複合リテラルって今ひとつ使い勝手が分からなかったんだが、
こういうことできるのが便利なんだな。
0365デフォルトの名無しさん
2007/02/26(月) 16:32:34.NETでいうSystem.IO.File.Exists(System.String)に相当する関数
0366デフォルトの名無しさん
2007/02/26(月) 16:35:280367デフォルトの名無しさん
2007/02/26(月) 16:40:030368デフォルトの名無しさん
2007/02/26(月) 16:56:41http://www.plustarnet.com/aspil/Programming/
今日から勉強しようと思ってるんですが、もっといいサイトがあったら教えてください。
0369デフォルトの名無しさん
2007/02/26(月) 17:03:090370デフォルトの名無しさん
2007/02/26(月) 17:06:15そのサイトはやめといたほうがいいんじゃないかな。
0371368
2007/02/26(月) 17:08:59どういう意味ですか?
0372デフォルトの名無しさん
2007/02/26(月) 17:13:230373デフォルトの名無しさん
2007/02/26(月) 17:22:59幾らか容量が分からないものを扱う時の宣言ってどうすれば良いですか?
例えば
typedef struct TESTD{
int ShainCode;
int KanriNo;
int ClientNo;
}TestDef;
みたいなのが有ったとして
これが顧客が無限に増え続ける様に作りたいんですけど・・・
0374デフォルトの名無しさん
2007/02/26(月) 17:25:170375デフォルトの名無しさん
2007/02/26(月) 17:38:01すいません
具体的にコード教えてください
0376デフォルトの名無しさん
2007/02/26(月) 17:44:490377デフォルトの名無しさん
2007/02/26(月) 18:04:060378デフォルトの名無しさん
2007/02/26(月) 18:08:030379デフォルトの名無しさん
2007/02/26(月) 18:08:380380デフォルトの名無しさん
2007/02/26(月) 18:19:290381デフォルトの名無しさん
2007/02/26(月) 18:27:260382デフォルトの名無しさん
2007/02/26(月) 18:33:01増やすとき全部の構造体が増えない?
聞いてる人は顧客のところだけ増やしたいんじゃないの?
0383デフォルトの名無しさん
2007/02/26(月) 18:36:040384デフォルトの名無しさん
2007/02/26(月) 18:41:32無限大には対応できないけど、これでおk?
typedef struct TESTD{
int ShainCode;
int KanriNo;
int *ClientNo;
int ClientCount;
}TestDef;
0385デフォルトの名無しさん
2007/02/26(月) 18:45:33日本語って本当に難しい・・w
0386デフォルトの名無しさん
2007/02/26(月) 20:01:42>>367
ファイルポインタがNULLだったらファイルが存在しないってやるしかないのかな?
具体的に関数としてそういう物があるなら教えてください。
0387デフォルトの名無しさん
2007/02/26(月) 20:07:020388デフォルトの名無しさん
2007/02/26(月) 20:20:560389デフォルトの名無しさん
2007/02/26(月) 20:25:180390デフォルトの名無しさん
2007/02/26(月) 20:34:310391デフォルトの名無しさん
2007/02/26(月) 20:38:40窓の世界に移り住んで久しいから、忘れてしもた
0392デフォルトの名無しさん
2007/02/26(月) 20:58:25可変にしたいやつをポインタで表して、それのためのメモリを malloc() で
確保すれば良い。長さを変える時は realloc() を使う。
ファイルから読んで一つづつ追加する場合は初期化時にポインタを NULL に
しておくと最初から realloc() で追加ができるので少し楽。
0393デフォルトの名無しさん
2007/02/26(月) 21:35:39TestDefが無限に増えつづけるようにしたいのなら
>>374も言ってるけど、最初に適当に1000件分とか読み込んで、
1000件以上なら500件分毎にでも領域確保すればいいよ。
counter1 = 0;
counter2 = 1000;
ptr = malloc(sizeof(struct TestDef) * 1000);
TestDef読込ループ(最後のTestDefまで) {
if(counter1 = counter2) {
counter2 = counter2 + 500;
realloc(ptr, sizeof(struct TestDef) * counter2);
}
TestDef1件読込
counter1 = counter1 + 1;
}
0394デフォルトの名無しさん
2007/02/26(月) 21:50:200395デフォルトの名無しさん
2007/02/26(月) 22:24:210396デフォルトの名無しさん
2007/02/26(月) 22:25:22増加量を500とか決め打ちにするとコピーにO(N^2)のコストがかかるからお勧めできない。
次のバッファサイズ = 現在のバッファサイズ * 2 とかだとO(N)で出来るのでお勧め。
0397デフォルトの名無しさん
2007/02/26(月) 22:25:29【キーボードからデータを5つ入力する。
次に入力するデータは、
何番目に入力したデータと一致するか表示するプログラム。】
0398デフォルトの名無しさん
2007/02/26(月) 22:33:170399デフォルトの名無しさん
2007/02/26(月) 22:34:07未来予知?
0400デフォルトの名無しさん
2007/02/26(月) 22:35:27顧客の増加の仕方によると思います
今3000件として顧客の増加率が低いのに6000件分も領域確保するのは無駄が多すぎ
0401デフォルトの名無しさん
2007/02/26(月) 22:40:056番目に入力したデータは何番目と一致するかってやつだとは思うんですけど、
全然わかんないんで誰か教えてもらえませんか?
0402デフォルトの名無しさん
2007/02/26(月) 22:46:04データってなに?
文字?文字列?整数?浮動小数点数?
0403デフォルトの名無しさん
2007/02/26(月) 22:48:31整数です!
0404デフォルトの名無しさん
2007/02/26(月) 22:48:42そういうのはrealloc()の中でやってるから、変にに工夫しないで一件ずつふやせばいいよ。
そっちのほうがコードすっきり。
0405デフォルトの名無しさん
2007/02/26(月) 22:51:380406デフォルトの名無しさん
2007/02/26(月) 22:58:01そういう増加量の予測(?)の仕方ってどういう範疇を勉強すればいいのですか?
ぐぐるんで、キーワードだけでも教えてください
0407デフォルトの名無しさん
2007/02/26(月) 22:59:54だから顧客の増加率によるんだって
数件ならいいけど数百、数千なんて規模(数千は無いと思うけど)って場合1件づつだとオーバーヘッドが増すでしょ
>>403
テキトー↓
int main()
{
int i,a[5],b;
printf("5件分入力する(データとデータはスペースで空ける)>");
scanf("%d %d %d %d %d",&a[0],&a[1],&a[2],&a[3],&a[4]);
printf("いれろ>");
scanf("%d",&b);
for(i=0;i<5;i++) if( b==a[i] ) break;
if( i<5 ) printf( "%dは%d番目と一致",b,i+1);
else printf( "%dと一致するもんはねぇ",b);
return 0;
}
0408デフォルトの名無しさん
2007/02/26(月) 23:07:51数百レベルなら、オーバーヘッド気にしなくて一件単位で確保していけばいいよ。
標準入出力のバッファリングは効率悪いから、ラッパー作って独自でバッファリングを
実装してるような話じゃん。
0409デフォルトの名無しさん
2007/02/26(月) 23:11:34メモリ確保の話だけど
0410デフォルトの名無しさん
2007/02/26(月) 23:15:40「ような」
0411デフォルトの名無しさん
2007/02/26(月) 23:18:33もう少し噛み砕いてっ
0412デフォルトの名無しさん
2007/02/26(月) 23:21:40で細々と書くのは、せっかくIOをライブラリ実装側でバッファリングして
いるのに自前でさらに外側にバッファリング処理を書くようなもの」とい
いたいのでしょう。
0413デフォルトの名無しさん
2007/02/26(月) 23:35:37私は馬鹿なようなので
>「せっかくIOをライブラリ実装側でバッファリング」
メモリ確保とどういう関係が?
0414デフォルトの名無しさん
2007/02/26(月) 23:36:14自分がC言語で作って使ってる動的配列構造体は、
コンテナに相当する配列が一杯になったら次にどんだけ
増加させるかの部分を、ある程度までは*2で、ある程度
を越えると+nのようになるようにしてる(デフォルトでは)。
この「ある程度」はアプリによると思う。また、ここのある
程度を計算する部分を関数コールバックによる実装で作
っておくとアプリによって簡単に変更できていいんじゃ
ないかな
C++ならvector等を使えるけど、Cなら汎用的な動的配列
や汎用リスト、動的ハッシュイブラリみたいなの
自分で実装しておかないといろんなアプリ作るの大変だよ
0415デフォルトの名無しさん
2007/02/26(月) 23:39:020416デフォルトの名無しさん
2007/02/26(月) 23:43:09一応調べてみたけど、手元のgccとvcではしてなかった。多分メモリ効率を考えてと思う。
どっちも固定量の増加で1ずつ増加する素直なコードだと数が増えると速度が目に見えて遅くなった。
自分が二倍伸張で書き直すと単純にほぼ線形時間で実行できた。
とりあえずreallocの伸張を信用することはあまりできなさそう。
0417デフォルトの名無しさん
2007/02/26(月) 23:57:45うんうん
私的には初期の段階(それこそ現在の入力数は数百程度)は*2でもいいと思う.
倍にしても大きな無駄領域生まないから.
店舗の顧客数にしても初期は新規会員がどっと来るからある程度予想して多めにしておくとか.
ある程度になると、小売ならちらほら程度だし、大手で各店管理じゃない)ならかなりの数になるだろうし.
で、過去の入力数とその間隔、もしくは単位時間当たりの入会数から動的に算出すればいいんじゃないかと.
>>416
そうだよね.指定したサイズのメモリ領域しか確保しないと思ってたんだけど↑のレスで、あーまた私わぁ〜勘違いしてたのかぁって思ったんだけど.
んで、私が言いたかったのは
「1件ごと reallocで確保する.で、たとえば予定の追加件数が200件あったとしてメモリ上に断片化が発生してた場合などに
数件ないし十数件ごとにブロックの変更があった場合、realloc内部で領域コピーが多発する」
ってことです
0418デフォルトの名無しさん
2007/02/27(火) 00:02:24「たとえ話」なんだから直接関係があるわけがないでしょう。
0419デフォルトの名無しさん
2007/02/27(火) 00:06:49はっ!
そか、たとえ話か
メモリのことをIOに例えてたのね
もう、明らかに関係があるのかと思ってしまったorz
0420デフォルトの名無しさん
2007/02/27(火) 00:38:42いつも*2でいくか、+nでいくか迷うけど、組み合わせるという手もあったのか!
でもしばらくは、*2でいくか、+nでいくか、組み合わせるかで試行錯誤することに
なりそうorz
0421デフォルトの名無しさん
2007/02/27(火) 00:44:05どこまで正しいか判らないですけど
連続領域でなくても、ブロック単位で確保して連結リストで管理ってのもいいかなと思いますけどね
http://www.ncad.co.jp/~komata/c-kouza6.htm より以下抜粋
realloc()はmalloc()で割り当てた領域を拡張しますが、malloc()は大抵少し大きめに確保するのですが、その先が既に使用中の場合は拡張できず、新しい領域を求めてヒープを拡大し、そこに元のデータをコピーし、元のデータを開放します。
従って、realloc()とmalloc()がループで回るような場合はほとんど拡大ができず、毎回realloc()は新しい領域を求めてしまうことになり、メモリーのすき間がたくさんできてしまうことになります。
(中略)
これを回避するにはrealloc()する単位を大きめに取り、realloc()を呼び出す回数をできるだけ減らすしかありません。
それでも無駄は完全には無くせませんが、空きになるサイズが大きくなるので他のmalloc()がそこを使用できる確立が上がり、コピーの回数も減らせますので、速度も上がります。
0422デフォルトの名無しさん
2007/02/27(火) 01:20:300423デフォルトの名無しさん
2007/02/27(火) 04:32:351:C言語に於いて、参照とはどういう意味なのでしょうか?
2:ifについて
if〜
return 1;
if〜
return 2;
とは、どういう意味でしょうか?
if〜
else if〜
とは違うのでしょうか?
0424デフォルトの名無しさん
2007/02/27(火) 05:11:451 C言語だけに限れば変数の中身にアクセスするとかそんな感じ?
"参照"単体ではうまく説明できん。
2 return文が入ってので何を質問してるのかよく分からないが、
前者は
もし〜ならreturn 1;
もし〜ならreturn 2;
であるのに対し後者は
もし〜なら・・・
でなく〜なら・・・
というように前者はreturnが無ければ両方のif文が実行され
後者は当てはまる条件のところ以外は実行されない(switch文と同じ感じ)
後者にも同様にreturn文が入っているのなら、if文の内容しだいだが動作は同じ
(だが同じものとして覚えてはいけない。なぜならreturn文が入っているからに過ぎない)
0425デフォルトの名無しさん
2007/02/27(火) 07:33:12CにC++のような参照はないから、普通に国語辞典の一番か二番あたりにに載ってるような意味だろう。
0426デフォルトの名無しさん
2007/02/27(火) 10:07:17質問が曖昧だといつもこうやってぐだぐだになるんだよなあ・・・
0427デフォルトの名無しさん
2007/02/27(火) 10:28:35//a.cpp
#include "game2.h"
#include "main.h"
extern int errorRog[1024];
・・・{
errorRog[0] = 0; //こちらで操作すると
//Error: 外部シンボル '_errorRog' が未解決
}
//b.cpp
#include "game2.h"
#include "main.h"
errorRog[0] = 0; //こちらで操作すると未定義
と注釈の通りで、原因は重複してヘッダを呼び出してるのがマズいんでしょうか?
できればヘッダにexternを組み込ませたいのですが
それ以前の問題でgame2.hには
//game2.h
typedef struct {
LPSTR cName; //名称
int cHp; //体力
}castData;
typedef struct {
castData cs[MAX_INPUT]; //キャスト
}cardData;
a.cpp,b.cpp共に呼び出す必要のある構造体の宣言があるのですが
重複して呼び出したらダメですよね?
0428427
2007/02/27(火) 11:36:300429427
2007/02/27(火) 12:20:49本コードにも宣言しないといけないんですね。
0430デフォルトの名無しさん
2007/02/27(火) 12:36:58K&Rのプログラミング言語C第2版的な位置付けの本がいいです。
そうでなくても、これ読んでないとモグリみたいなのを教えてください・・
0431デフォルトの名無しさん
2007/02/27(火) 14:52:46int *pa = &a;
これおかしくね?
*pa = &a; 何で値にアドレスを代入するの
0432デフォルトの名無しさん
2007/02/27(火) 14:59:150433デフォルトの名無しさん
2007/02/27(火) 15:56:17extern をヘッダファイルに書けば万事解決
0434デフォルトの名無しさん
2007/02/27(火) 15:59:04レス遅れてすいません。
皆さんレスどもです。
頑張ります。
0435デフォルトの名無しさん
2007/02/27(火) 16:46:42規格でそう決まっているから、としか言いようがない
0436デフォルトの名無しさん
2007/02/27(火) 16:50:48代入と初期化は別だから
0437デフォルトの名無しさん
2007/02/27(火) 16:55:02ありがとうございました。
教えていただいたキーワードで検索したところ、ほかにも方法があったのでURL貼っておきます
http://www.tohoho-web.com/lng/199911/99110136.htm
0438デフォルトの名無しさん
2007/02/27(火) 16:55:50int &rx = x;
これおかしくね?
&rx = x; 何でアドレスにint型の変数を代入するの
0439デフォルトの名無しさん
2007/02/27(火) 16:58:04スレタイ嫁
0440デフォルトの名無しさん
2007/02/27(火) 17:09:41int *pa = &a;
は、int *型の変数paにaのアドレスを代入してる
間接参照演算子の * とは全くの別物
0441デフォルトの名無しさん
2007/02/27(火) 18:01:31#include <ctype.h>
int main(void)
{
char str[80], *p;
printf("文字列を入力してください:");
gets(str);
p=str;
while(*p) {
*p++ = toupper(*p);
}
printf("%s\n", str); /* 大文字の文字列 */
return 0;
}
実行結果 hiro→HIRO
参考書のとおりにやったんですが、僕は実行結果がhIROになるとおもってました。
なぜかというと最初のp=strでstr[0]のアドレスがpに入りますよね。でwhileループで
一番最初に*p++ = toupper(*p)としていますが、この一文は最初にp++でpをインクリメントしてしまい
pはstr[1]を指し、str[0]を飛ばしてしまうとおもったのですが・・
わかりません。よろしくお願いします。
0442デフォルトの名無しさん
2007/02/27(火) 18:04:33*++p = toupper(*p);と書けば先にインクリメントされるので、
お前が想像しているとおりになるだろう。
0443デフォルトの名無しさん
2007/02/27(火) 18:09:01p++は副作用(オブジェクトの値の変化)を起こす式だから、
文の終わりやカンマ演算子などの副作用完了までの間に
pの値を参照することはできない。
そのようなコードを書いた場合、どのような挙動になるかは定義されていない
この場合、
p++; *p = toupper(*p);
とするのが正しい。
0444デフォルトの名無しさん
2007/02/27(火) 18:13:40前置インクリメント演算子くらい知っとこうや。
p++とtoupper(*p)のどちらが先に評価されるかは未定義。
0446441
2007/02/27(火) 18:19:33なんか、むずかしいですね。とりあえず、>>442さんのいうとおりにやると
僕の予想したようになりました。独習Cを読んでいるんですが、後置の場合
式の評価の後にインクリメントされるとかいてあったので、納得できました。
今回の件は一応はなっとくできました。ありがとうございました。
0447441
2007/02/27(火) 18:21:09いくうちにわかると思いますので頭の片隅においておきたいとおもいます。
ありがとうございました。
0448デフォルトの名無しさん
2007/02/27(火) 18:23:13前置にしたって未定義に変わりはないがな
0449デフォルトの名無しさん
2007/02/27(火) 18:24:58へー
0450デフォルトの名無しさん
2007/02/27(火) 18:28:31未定義なコードを一箇所でも書くと、
コード全体で何が起こるか未定義になるよ。
0451デフォルトの名無しさん
2007/02/27(火) 18:30:31「プログラムは奇跡で出来ている。」
いやいやいやいや。
この問題の本質はインクリメントが前置か後置かじゃないから。
右辺のpを先に評価するような処理系なら左辺のインクリメントを前に置こうが
後ろに置こうが結果は同じ。
0453デフォルトの名無しさん
2007/02/27(火) 18:35:10ソース読んでもどの順番か未定義にだったらお手上げだしね。(動かしつつ直せばいいけど)
>>441の参考書が悪いってことでFA?
0454デフォルトの名無しさん
2007/02/27(火) 20:04:33realloc()を使ってお手軽にすませましょうってコードで、増分どうこうって工夫してもしょうがないだろって
ことだったんだけどな。
0455デフォルトの名無しさん
2007/02/27(火) 22:28:49#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
char *strdup_printf (char *format, ...)
{
va_list argp;
char *buf=NULL;
int size=512, inclen = 512;
buf = calloc(1, size);
if (!buf) return(NULL);
va_start (argp,format);
n=vsnprintf(buf, size, format, argp);
va_end (argp);
while(n<1) {
size += inclen;
buf = realloc(buf, size);
if (!buf) return(NULL);
va_start (argp, format);
n=vsnprintf(buf, size, format, argp);
va_end (argp);
}
以下略
0456デフォルトの名無しさん
2007/02/27(火) 23:07:350457デフォルトの名無しさん
2007/02/27(火) 23:15:02複数回使える。
当然char* format の中身は"%s%s%d%s"みたいな形だよね?
0458デフォルトの名無しさん
2007/02/27(火) 23:31:18ありがとうございます。m(__)m
>当然char* format の中身は"%s%s%d%s"みたいな形だよね?
そゆことです。
0459デフォルトの名無しさん
2007/02/28(水) 01:00:20を返すとは、どういう事なのでしょうか?
return 0;
を返すと何が違いますかね?
0460デフォルトの名無しさん
2007/02/28(水) 01:04:30x = nanika();
nanikaがreturn -1としていたらxの値は-1になる。return 0なら0。
返ってくる値を特に利用しないのなら何を返しても良いし、return;
だけで何も返さないことにしてもよい。
返ってくる値の意味は作り手が決める。
0461デフォルトの名無しさん
2007/02/28(水) 01:05:40>を返す
つまり、
return(return -1)
どうみてもコンパイルエラーです、本当に(ry
0463デフォルトの名無しさん
2007/02/28(水) 01:24:23#include <stdlib.h>
int compare(const void *a, const void *b){
int x = *((int *)a); /*void型のポインタを、int型ポインタにキャストして、そこにある値を求めます。*/
int y = *((int *)b); /*void型のポインタを、int型ポインタにキャストして、そこにある値を求めます。*/
if(x > y)
return 1;
else if(x < y)
return -1;
else
return 0;
}
0464463
2007/02/28(水) 01:24:54int nums[10] = {4,8,3,7,5,2,9,1,6,10};
int a = 7, i;
int *p;
qsort(nums, 10, sizeof(int), compare);
for(i = 0; i < 10; i++)
printf("%d", nums[i]);
printf("\n%dを検索します\n", a);
p = (int *) bsearch(&a, nums, 10, sizeof(int), compare);
if(p == NULL)
printf("%dは見つかりませんでした。\n", a);
else
printf("%dは配列nums[%d]にあります\n", a, p-nums);
return 0;
}
実行結果
c:\source>huroku
12345678910
7を検索します
7は配列nums[6]にあります
0465463
2007/02/28(水) 01:31:23>>int compare(const void *a, const void *b){
の const void *bに入れる値はmainの中の何処にあるのでしょうか?
>>*((int *)a);
は何なのでしょうか?ダブルでポインタのマークがありますが・・・・
詳しい解説お願いします。
クイックソートのcompare >>qsort(nums, 10, sizeof(int), compare);
は、const void *a,を指すのでしょうか?
検索のcompare >>p = (int *) bsearch(&a, nums, 10, sizeof(int), compare);
は、const void *b,を指すのでしょうか?
ご助言、宜しくお願い致します。
なるべく簡単に・・・・初心者向けにご返答戴ければ、尚幸いです。
0466デフォルトの名無しさん
2007/02/28(水) 02:23:02#include <stdlib.h>
#include <time.h>
#define MAX_NUM 100
int main(){
int n = -1;
int answer;
/*乱数の発生*/
srand(time(NULL));
answer = (rand() % MAX_NUM) + 1;
printf("数当てクイズ!1〜%dの数字を入力してね\n", MAX_NUM);
while(n != answer){
scanf("%d", &n);
if(n == answer-1 || n == answer+1)
printf("美味しい!\n");
else if(n > answer+1)
printf("もっと小さい数です\n");
else if(n < answer-1 )
printf("もっと大きい数です\n");
}
printf("正解です!\n");
return 0;
}
このソースに於いて、if(n == answer-1 || n == answer+1)の
answer+1やanswer-1の-1、+1はどうして付くのでしょうか?
そもそも、これらは何なのでしょうか?
0467デフォルトの名無しさん
2007/02/28(水) 02:25:30宝くじ一等前後賞のチェック
宝くじ一等は関係無いけど
0468デフォルトの名無しさん
2007/02/28(水) 02:26:54「美味しい」じゃなくて「惜しい」だね。
0470デフォルトの名無しさん
2007/02/28(水) 02:33:53例えば、answer が 10 だとすると、
「惜しい!」ってぇのは何と何だ?
0471デフォルトの名無しさん
2007/02/28(水) 02:37:59>>>int compare(const void *a, const void *b){
>の const void *bに入れる値はmainの中の何処にあるのでしょうか?
qsort関数の最後の引数としてcompare関数の名前(関数ポインタ)を渡している。
これはqsort関数が配列の要素を比較するときに使う関数。
qsort関数では、aとbに並べ替え対象の配列の要素のいずれかを入れて、渡され
た関数を何度も呼び出す。
>>>*((int *)a);
>は何なのでしょうか?ダブルでポインタのマークがありますが・・・・
int x = *((int*)a)を分けて書くと、
int* a_int = (int*)a;
int x = *a_int;
qsortは、さまざまな型のデータを並べ替えることが出来なければならないの
で、比較関数を呼ぶ際には、比較対象の2データを指すポインタを汎用のvoid*
型で渡すように作られている。
受け取った側ではintの値として比較したいので、まずvoid*型のポインタを
int*型にキャストし、*で値を取り出している。
bsearchも同じような形で比較用の関数を何度も呼ぶ。
>クイックソートのcompare >>qsort(nums, 10, sizeof(int), compare);
>は、const void *a,を指すのでしょうか?
>検索のcompare >>p = (int *) bsearch(&a, nums, 10, sizeof(int), compare);
>は、const void *b,を指すのでしょうか?
意味が分かりません。
0472デフォルトの名無しさん
2007/02/28(水) 02:59:52>>const void *bに入る値はmainの中の何処にあるのでしょうか?
mainの中には無い。qsortのための比較関数を(関数ポインタ)。
第一引数int x = *((int *)a); が第二引数y = *((int *)b);より
小さい/等しい/大きいの順番で返す値も
0より小さい/等しい/大きい整数を返す。
bsearchも同様。bsearchは配列が整列済みでないと駄目。
>>*((int *)a)
かっこは中から見れば良い。まず、int型のポインタにキャストした。
そしてそのポインタが指してる値を知るには*を付けるということ。
例えば((int *)a)だけだと、int型のポインタにキャストしただけで
要は、それだとaが指してるアドレスを取り出すことになる。
そこで*をつけて、そのアドレスの指し示してる値を取り出す。
0473463
2007/02/28(水) 04:13:41真にありがとうございます。
凄いとても難しいですね、ちょっとどころか
理解できないようなので出直してきます。。。
ポインタがとかの応用がさっぱりです。
>>int* a_int = (int*)a;
int x = *a_int;
こんなのも参考書には、載っていません
因みに上のソースはその参考書なのですが・・・
0474デフォルトの名無しさん
2007/02/28(水) 05:04:58ちなみに、malloc()の戻り値もvoid*型だよ
今の規格では、キャストしなくても良い、本来は
int *a = (int *)malloc(100 * sizeof(int));
ってするところint *a =malloc(100 * sizeof(int));でも良いようになってる
(ちなみに上記はint型サイズ100個分のメモリをヒープから借りる)
ま、とりあえずvoid型のポインタを使うときは、malloc()とかでない限り
本来の型にキャストすべし。
ま、勉強していくうちに、そのうちなれるよ。
0475デフォルトの名無しさん
2007/02/28(水) 05:10:17きっちり説明してあるように見えるのは気のせいか?
0476473
2007/02/28(水) 05:19:47ひぃ〜難しい、void型のポインタとかを今参考書の索引を漁っていますが
やはり載っていない、キャスト演算やmalkcoのメモリー獲得も
本の解説と照らし合わせてますが、さっぱりなので参考書を買い直し
ここで解説して頂いた事を再度見直してみます。
ありがとうございましたノシ
0477デフォルトの名無しさん
2007/02/28(水) 06:06:52とは言え、当てにならない参考書だねぇ。
0478デフォルトの名無しさん
2007/02/28(水) 10:47:00("SEC"を受け取ったら"CES"と表示する関数put_rstringを作成せよ。
という問題でオレはこうやったんですが
http://eggrice.no.land.to/up/src/tohoh0137.txt
もうすこしいい方法ないでしょうか?
stdio.hのみでおねがいします。
0479デフォルトの名無しさん
2007/02/28(水) 11:21:430480デフォルトの名無しさん
2007/02/28(水) 11:22:14char *endc = str;
char *startc = str;
//終端文字検索
while(endc != '\0')endc++;
endc--;
for(;startc < endc;startc++,endc--){
char tmp = startc;
startc = endc;
endc = tmp;
}
}
0481デフォルトの名無しさん
2007/02/28(水) 11:41:24strncpy(cD->cs[nxt].cBmp ,
//現在読み込んでいるポインタ-文字の長さ
readStr + i - txtLen ,
txtLen);
位置(i)も文字数(txtLen)も合っているのに取得できません。
何ででしょうか?教えてください。
0482デフォルトの名無しさん
2007/02/28(水) 11:44:51こうだろ
文字の長さ-現在読み込んでいるポインタ
0483デフォルトの名無しさん
2007/02/28(水) 11:47:06#include <stdio.h>
void put_rstring(char *c)
{
int i = 0;
while(*(c + i))
i++;
while(i > 0){
i--;
putchar(*(c + i));
}
}
0484デフォルトの名無しさん
2007/02/28(水) 12:04:01>>483
ありがとうございます。
添字のカウントの仕方は大体同じなんですね。
0485481
2007/02/28(水) 12:07:31う〜ん。分からん。
ポインタが先じゃないとおかしいのでは?
他の文字列なら代入できたのですが、cD->cs[nxt].cBmpがおかしいとか?
0486481
2007/02/28(水) 12:22:39NULL文字入れるところ
= '\0' じゃなくて == '\0'
やってた。なぜエラー出ないんだ・・・。
情報不足マジですみません。
でも午前中ずっとこれに悩んでたんです。
0487デフォルトの名無しさん
2007/02/28(水) 12:24:47もうちょいソースくらはい。
0488デフォルトの名無しさん
2007/02/28(水) 12:28:23その場合、比較演算子として真:1 偽:0のどちらかを返す。
エラーは出ません。
0489デフォルトの名無しさん
2007/02/28(水) 14:17:57コンパイラがエラー出すのは構文上の間違い、あるいは制約上の間違いのみ。
== '\0'でも構文的に間違いじゃないなら普通にバイナリ吐く。
0490デフォルトの名無しさん
2007/02/28(水) 15:19:38全ての警告が出るようにコンパイルオプションを与えるなり、
統合環境ならそう設定するなりしておくがいいよ。
0491デフォルトの名無しさん
2007/02/28(水) 21:47:17例えばサイコロ1〜6をランダムに
とか
1000番代のみの乱数とか
7桁で頭が906で始まる906****みたいな番号を作る
0492デフォルトの名無しさん
2007/02/28(水) 21:56:41[1, 6]の整数乱数が欲しければ、
1 + (int)(6 * rand() / (RAND_MAX + 1.0))
としてやればいい。
あとは適当に考えれ。
0493カルドセプト
2007/02/28(水) 22:34:21メルセンヌがどうとか言ってスレ荒らしちゃうぞー
0494デフォルトの名無しさん
2007/03/01(木) 00:13:51>>491
1+rand()%6これで1〜6の乱数。(もしかしたらintキャストがあったほうがいいかも)
オフセット+rand()%個数って感じか?
0495デフォルトの名無しさん
2007/03/01(木) 00:17:17>493
0496デフォルトの名無しさん
2007/03/01(木) 00:25:08つ 9060000 + rand() % 10000
0497デフォルトの名無しさん
2007/03/01(木) 01:28:200498デフォルトの名無しさん
2007/03/01(木) 02:24:59rand() % 2の場合、
2の倍数でなければかなり大きな偏りができるのか?
0499デフォルトの名無しさん
2007/03/01(木) 04:50:470500デフォルトの名無しさん
2007/03/01(木) 06:58:51それ本気で言ってるの?
0501デフォルトの名無しさん
2007/03/01(木) 07:15:32普通に考えたら除数の倍数じゃなかったら偏りは出来るな。
0502デフォルトの名無しさん
2007/03/01(木) 07:21:49マジレスすると下位ビットの品質は悪いからそんなことしちゃいかん
0503デフォルトの名無しさん
2007/03/01(木) 08:11:40多くの場合は線形合同法だから、それに対応した対策は必要だと思うよ。
MTでrand()を実装してる処理系ってあるのかなあ。
0504デフォルトの名無しさん
2007/03/01(木) 13:02:23randを使うときはrand()%nでOK。
それ以外の実装を使うときは下位ビットの精度も問題ないだろうからこれも問題なし
0505デフォルトの名無しさん
2007/03/01(木) 13:28:040506デフォルトの名無しさん
2007/03/01(木) 14:14:130507デフォルトの名無しさん
2007/03/01(木) 14:53:49下位ビット捨ててる実装な場合もあるから一概には言えんな。
0508デフォルトの名無しさん
2007/03/01(木) 15:09:54どなたか教えていただけないでしょうか?
0509デフォルトの名無しさん
2007/03/01(木) 15:17:24recv(int s, void *buf, size_t len, int flags);
sはファイルディスクリプタ(=ソケット)。
bufが受け取ったデータを格納する領域で、
lenがそのサイズ。
flagsは具体的にどういう値が入るかは上記マニュアルを参照。
0510デフォルトの名無しさん
2007/03/01(木) 15:28:050511デフォルトの名無しさん
2007/03/01(木) 15:31:42いるのですがどういう意味なのですか?
0512デフォルトの名無しさん
2007/03/01(木) 15:34:220ってことは無指定ということだ。
0513デフォルトの名無しさん
2007/03/01(木) 17:01:30なにかオススメの本とかありますか?
0514デフォルトの名無しさん
2007/03/01(木) 17:23:09例えば、6バイト目(バイナリエディタで開くと03になっている)が
03かどうかを調べたいんです。
strcmp(6byteme,"03")
とかやっても駄目だし。
教えてくんなまし。
0515デフォルトの名無しさん
2007/03/01(木) 17:32:060516デフォルトの名無しさん
2007/03/01(木) 17:37:56以下の方法をとることでメモリの必要量を削減することは可能でしょうか?
(メモ帳を変数の1次配列として使うことでメモリの節約になりますか?)
・記述
FILE *pFile;
long iL;
int iBuffer[4000];
//4000000*4000000個分のintをメモ帳に書き込む
pFile = fopen("test.ini", "wb"); if ( !pFile ) { exit(1); }
for (iL=0 ; iL<4000000000 ; iL++){
中略(iBuffer[0〜3999]に整数を代入し、fwriteで4000個書き込む)
}
fclose(pFile);
//4000000*4000000個分のintを4000個づつ読み込み、その数値を判定
pFile = fopen("test.ini", "rb"); if ( !pFile ) { exit(1); }
while (云々) {
fseek(pFile,0,SEEK_SET);//ファイルの読み取り開始位置を初期化
for (iL=0 ; iL<4000000 ; iL++){
if ( EOF == fread(iBuffer, sizeof(int), 4000, pFile) ) { exit(1); }
中略(iBuffer[0〜3999]の値ごとに処理)
}
}
fclose(pFile);
0517デフォルトの名無しさん
2007/03/01(木) 18:07:08まあメモリの節約にはなっている。
お前の頭に余裕があれば、メモリマップドファイルという手もある。
0518デフォルトの名無しさん
2007/03/01(木) 18:17:44うまく確保できないのでどなたかヘルプお願いします。
書いたコードは下記のようなものです
int i,x,y;
tyepedef struct{
int member1;
int member2;
}ST1;
ST1 **sample;
sample = (ST1 **)malloc(sizeof(ST1)*y);
for(i=0;i<y;i++){
sample[i] = (ST1 *)malloc(sizeof(ST1)*x);
}
0520デフォルトの名無しさん
2007/03/01(木) 18:44:05sample = (ST1 **)malloc(sizeof(ST1 *)*x);
for(i=0;i<x;i++){
sample[i] = (ST1 *)malloc(sizeof(ST1)*y);
}
0521デフォルトの名無しさん
2007/03/01(木) 19:09:11//確保する数 sample[M][N] の形で確保される
#define M 5
#define N 10
//ST1をN個持つ配列のポインタ
ST1 (*sample)[N];
//をM個確保
sample = (ST1 (*)[N])malloc(sizeof(*sample) * M);
でいけると思います。
0522デフォルトの名無しさん
2007/03/01(木) 19:18:44$(OBJS): $(HEADS) Makefile
行は何をしているのでしょうか?
ttp://www-or.amp.i.kyoto-u.ac.jp/algo-eng/db/template/Makefile.nsrc1bin
0523デフォルトの名無しさん
2007/03/01(木) 19:39:140524デフォルトの名無しさん
2007/03/01(木) 19:39:29アホか。それだとMとNの値がコンパイル時に固定されてしまうだろ。
0525デフォルトの名無しさん
2007/03/01(木) 19:48:350526デフォルトの名無しさん
2007/03/01(木) 19:54:40が、この場合には当てはまらないな。
0527デフォルトの名無しさん
2007/03/01(木) 19:56:48が、俺のチンポには当てはまらないな。
0528デフォルトの名無しさん
2007/03/01(木) 19:59:33が、俺の懐゚には当てはまらないな。
0529デフォルトの名無しさん
2007/03/01(木) 20:28:40投稿してからしまったと思いました。
0530今日始めた超初心者
2007/03/01(木) 21:13:38main() {
printf("Hello!");
rewind(stdin); //追加行:標準入力を初期化する
getchar(); //追加行:1文字入力を待つ
return 0;
}
でコンパイルしようとしたら、
不正な文字 というエラーがでました。
どこが悪いんでしょうか
0531デフォルトの名無しさん
2007/03/01(木) 21:15:190532デフォルトの名無しさん
2007/03/01(木) 21:17:340533デフォルトの名無しさん
2007/03/01(木) 21:21:27今ではwhile(getchar() != '\n');でいいんじゃないかと思えるようになった。
0534デフォルトの名無しさん
2007/03/01(木) 21:23:37BYTE*型の要素の数を求めたいです。
for(i = 0;i < (int)(bmpFileHeader.bfSize - bmpFileHeader.bfOffBits);i++)
bPPixelBits[i] = bPixelBits[i];
intにキャストはできないみたいなんですが、
どうすれば求められますか?
0535デフォルトの名無しさん
2007/03/01(木) 21:28:260536530
2007/03/01(木) 21:32:02ありがとうございました。
0537535
2007/03/01(木) 22:14:34BYTE **pBPixelBits;
pBPixelBits = (BYTE **)malloc(bmpFileHeader.bfSize - bmpFileHeader.bfOffBits);
for(i = 0;i < (int)(bmpFileHeader.bfSize - bmpFileHeader.bfOffBits);i++) {
bPPixelBits[i] = bPixelBits[i];
pBPixelBits[i] = &bPPixelBits[i];
}
PixelRGBSet(0 , 0 , 0x000000 , pBPixelBits);
int PixelRGBSet(int x , int y , COLORREF clr , BYTE **bPixelBits) {
*bPixelBits[px+py+2] = GetRValue(clr);
}
関数内でbPixelBitsに代入しようとしたら、1ビット分しかありませんでした。
ポインタの使い方色々と間違っていると思いますが、
bPixelBitsに代入するほふほふを教えてくださいあ。
0538535
2007/03/01(木) 22:26:52○要素の数が1ビット分
0539デフォルトの名無しさん
2007/03/01(木) 22:31:47の意味がわからんです
0540535
2007/03/01(木) 22:37:44自分の認識ではBYTE*(bPixelBits)に代入するには
そのポインタを作ればいいのかと思ってBYTE**に代入して
それを渡したんですが・・・違いますか?
0541デフォルトの名無しさん
2007/03/01(木) 22:42:45関数内のpx+py+2も意味不明
0542535
2007/03/01(木) 22:49:37この関数は読み込んだビットマップをボトムアップから上からxy座標を指定する方法に変えることで
より簡単にその座標の情報(BYTE)を変更するためのコードです。
pxとpyは読み込んだビットマップのピクセルビットを調整しています。
px = x * 3;
py = (-(y - bmpInfo.bmiHeader.biHeight)-1) * bmpInfo.bmiHeader.biWidth * 3;
必要ないと思って省きました。多分要素の数がオーバーしたんだと思って・・・。
0543デフォルトの名無しさん
2007/03/01(木) 22:52:40標準入力に対するrewind()は未定義。
0544535
2007/03/01(木) 23:18:42要点だけまとめたつもりなんですが、bPixelBitsかbPPixelBitsを
PixelRGBSetの第4引数に渡したいんです。bPixelBitsはグローバルだけど渡したいんです!
何で関数内じゃ範囲外なのか分かりません。
お願いします。
0545デフォルトの名無しさん
2007/03/01(木) 23:41:28pPixelBits[〜] = GetRValue(clr);
}
PixelRGBSet(0 , 0 , 0x000000 , bPixelBits);
じゃだめなん?
0546デフォルトの名無しさん
2007/03/01(木) 23:53:28逆でした汗
これでいけますね。
>>521
配列の要素数までも動的なのでこの方法では不可能です。
0547535
2007/03/02(金) 07:16:01ありがとうございます。
上手くいきました。どうやらWM_PAINTのとき別のピクセルビット(bPPixelBits)を
読み取っていたようで更新されていませんでした。すみません。
しかし関数内ではint型に代入するにはint*型に変えなくてはいけないのに、
BYTE*型もBYTE**型になるのではと思ったんですが・・・
0548デフォルトの名無しさん
2007/03/02(金) 08:14:46代入したいのは BYTE* じゃなくて BYTE だからね
0549デフォルトの名無しさん
2007/03/02(金) 11:01:28ソケット関数でsend(),sendto(),sendmsg() の3つの違いがわかりません。
また同様にrecv(),recvfrom(),recvmsg()もわかりません。
親切な方宜しくお願いします。
0550デフォルトの名無しさん
2007/03/02(金) 12:15:33sendmsg()はみたことない
0551デフォルトの名無しさん
2007/03/02(金) 12:30:300552デフォルトの名無しさん
2007/03/02(金) 12:41:30send ... バイト列をソケットに書き込む。あて先指定が無いので、bindされたソケットじゃないとエラーになる。
sendto ... バイト列をソケットに書き込む。あて先を指定して送れる。主にDGRAM(UDP)ソケット用。
sendmsg ... 複数のバイト列のデータをまとめて、ソケットに書き込む。あて先も指定できる。
何かのヘッダ書いて、2段目のヘッダ書いて、ペイロードみたいなとき、sendtoだと、一旦連続する
メモリ領域にバイト列を作成しないといけないので、mem-to-memのコピーが発生する。sendmsgなら、
そのコピーを抑制できる。
sendmsgが最強で、sendmsgでできないことは無い。残り2つは、sendmsgのラッパになってる、ことが多い。
recv側は書くのが面倒なので誰かに任せる。sendと似たようなもんだ。
0553デフォルトの名無しさん
2007/03/02(金) 15:27:48int x;
x = open("/usr/local/etc/apache22/httpd.conf",2);
lseek(x,SEEK_SET,12);
write(x,"111.111.111.111",16);
return(0);
}
これを実行したらhttpd.confがひらけなくなりました。
なにが原因なのでしょうか?教えてください。
0554デフォルトの名無しさん
2007/03/02(金) 15:35:34ありがとうございます。
0555デフォルトの名無しさん
2007/03/02(金) 15:52:03無茶しているなぁ。テキストファイルに低レベルIO関数使うなんて。
見たところ、ナルキャラ書き込んでしまっているくらいで開けなくなる要素は見当たらないけど。
0556デフォルトの名無しさん
2007/03/02(金) 15:58:12ソースはだいじょうぶそうですか。
じつはgnomeのnautilusの調子が悪いんでそっちのほうがげいいんでかも
しれないです。
.confが全部すぐにひらけなくなりました。
でなおしてきます。
ありがとうございました。助かりました。
0557デフォルトの名無しさん
2007/03/02(金) 16:01:43closeしなかったからかな?
それにしても、テストしないでぶっつけ本ちゃんとは勇気あるな。
0558デフォルトの名無しさん
2007/03/02(金) 16:08:03> closeしなかったからかな?
なわけない
0559デフォルトの名無しさん
2007/03/02(金) 16:37:46>じつはgnomeのnautilusの調子が悪いんでそっちのほうがげいいんでかも
鯨飲?
0560デフォルトの名無しさん
2007/03/02(金) 16:41:03gay-in?
0561デフォルトの名無しさん
2007/03/02(金) 17:49:370562デフォルトの名無しさん
2007/03/02(金) 17:57:01printf("%s", hoge); ではなくて printf(hoge); でも出来るみたいだけど
やっぱり前者使ったほうがいいですか?
0563デフォルトの名無しさん
2007/03/02(金) 18:00:480564デフォルトの名無しさん
2007/03/02(金) 18:02:370565デフォルトの名無しさん
2007/03/02(金) 19:01:240566デフォルトの名無しさん
2007/03/02(金) 19:18:560567デフォルトの名無しさん
2007/03/02(金) 19:31:10>>566
write は非標準関数だぜ。
0568デフォルトの名無しさん
2007/03/02(金) 19:38:42・そもそも何でプログラム打てばよいのでしょうか
(HTMLみたいにワードパッドで入力して拡張子変換するのでしょうか?)
・実行の仕方は?
0569デフォルトの名無しさん
2007/03/02(金) 19:43:43>(HTMLみたいにワードパッドで入力して拡張子変換するのでしょうか?)
テキストファイルが作れるなら何でもいいけど、C 言語向けのエディタは色々ある。
>・実行の仕方は?
C 言語のプログラムを実行ファイルに変換する必要がある。
まあ、とりあえずこれ使っとけ。
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/
0570568
2007/03/02(金) 19:52:31家にインターネット引いてないから(所謂携帯厨)実行用のがダウンロードできないです…orz
ネット喫茶で落としてきます\
ありがとうございます
0571デフォルトの名無しさん
2007/03/02(金) 20:07:46とにかくまずはテキストファイル作れば良いんだよ。
てか、その辺のことも書いてある入門書を探せ。
0572デフォルトの名無しさん
2007/03/02(金) 20:07:590573デフォルトの名無しさん
2007/03/02(金) 20:13:13やはりネット環境は整える方向で検討した方が良い。
0574デフォルトの名無しさん
2007/03/02(金) 20:14:52俺は昔に体験版が付いてる本買った
体験版でもそれなりのもんだったぞ
そういうの探して買え
0575568
2007/03/02(金) 20:15:42今更浮気できません
明解C言語入門編…
0576デフォルトの名無しさん
2007/03/02(金) 20:25:57bcc使ってた時にはwindows.hをインクルードしてSleepって関数を使ってたんですが、使えませんでした。
代替する物があるんですか?初心者なんで良く分かりません。
誰か教えてください。
0577デフォルトの名無しさん
2007/03/02(金) 20:31:160578デフォルトの名無しさん
2007/03/02(金) 20:32:15そもそもwindows.hが見つからないと。
製品版買えというお告げでしょうか?
0579デフォルトの名無しさん
2007/03/02(金) 20:35:55もしかしてVisual C++ tool kit ( 名前はうろ覚えなんで微妙に間違ってるかも )か?
あれならそれとは別に platform sdk (無料)も必要だぞ。
0580デフォルトの名無しさん
2007/03/02(金) 20:45:43製品版買え?製品版じゃないの?
EEならプラットフォームSDKは入ってなかった気がするから
自分でインストールしないといけないよ。
0581デフォルトの名無しさん
2007/03/02(金) 20:46:17使ってるのはMicrosoft Visual C++ 2005 Express Editionってやつですが、
Platform SDKってのを入れてみます。アドバイスありがとうございました。。
0582デフォルトの名無しさん
2007/03/02(金) 21:40:11cygwinかlinux入れとけ標準で開発環境がインストールされとる
0583デフォルトの名無しさん
2007/03/02(金) 21:50:53(使えるようにできないこともないけど)
Linux だと現在は漢字がそのまま使えるディストリビューションが普通だ。
(この書き込みも Linux からやっている)。
Windows から離れたくない場合は VMware Player や qemu 上でエミュレート
して動かすとか、あるいは CD 起動の KNOPPIX で起動して一時的に Linux
マシンにするとか、色々方法はある。必ずしも Linux をPCにインストール
しなければならないということはない。
0584デフォルトの名無しさん
2007/03/02(金) 22:02:24GUI以外は。
0585デフォルトの名無しさん
2007/03/02(金) 22:15:21ここはオーソドックスにBCCを勧めて放流
しばらくすれば「パスが通りません」って帰ってきます
0586デフォルトの名無しさん
2007/03/02(金) 22:28:52オレは今BCC + BCpadでやってるよ。
Visual C++はもうちょい進んでからでいいんじゃないかな〜
0587デフォルトの名無しさん
2007/03/02(金) 22:55:000588デフォルトの名無しさん
2007/03/03(土) 00:09:02template.obj : error LNK2019: 未解決の外部シンボル __imp__DispatchMessageA@4 が
関数 _WinMain@16 で参照されました。
template.obj : error LNK2019: 未解決の外部シンボル __imp__TranslateMessage@4 が
関数 _WinMain@16 で参照されました。
などのエラーが出ます。VC++IDE本体からコンパイルやbcc32.exeでのコンパイルは問題無くできます。
何が原因でしょうか?
0589デフォルトの名無しさん
2007/03/03(土) 00:32:00vsvars32.batは実行した?
0591デフォルトの名無しさん
2007/03/03(土) 01:20:50VC++IDEもっているなら
clやlinkのコマンドラインを調べられるんじゃない?
コマンドラインに何か足りない気がする。
推測なので間違えているかもしれませんけど。
ところでVC2005とかってmakeファイル作る機能がなくなったのか?
0592デフォルトの名無しさん
2007/03/03(土) 02:09:23知らない単語の命令でてきたら調べるとかで
0593デフォルトの名無しさん
2007/03/03(土) 02:11:03中二レベルの英語力が有れば大丈夫だと思ふ。
0594デフォルトの名無しさん
2007/03/03(土) 02:15:43cl の引数にuser32.libをいれるべし。
MSDN見れば各APIに必要なlibがわかるよ。
IDEはここら辺勝手にやってくれるみたいだけど。
>> 592
C言語理解だけなら、単語だけわかれば何とかなると思う。
ただ、英語のドキュメントしかないライブラリとかもあるから、
英語できるに越したことはないよ
0596デフォルトの名無しさん
2007/03/03(土) 04:36:57横と縦とか解説には書いてありますが、
納得できません。
0597デフォルトの名無しさん
2007/03/03(土) 04:44:33単に、二重のループということだけです。
Ex.
for (int i = 0; i < 10; ++i) for (int j = 0; j < 10; ++j) printf("%d, %d\n", i, j);
0598596
2007/03/03(土) 04:46:06123456789 123456789
こうなのでしょうか?
0599デフォルトの名無しさん
2007/03/03(土) 04:46:590600デフォルトの名無しさん
2007/03/03(土) 04:54:59int i,j;for(i=0;i<=1;i++){for(j=1;j<=9;j++)putchar('0'+j);putchar(' ');}
0601デフォルトの名無しさん
2007/03/03(土) 07:41:18コンパイラーはBorland C++ 5.5.1をダウンロードして使おうと思いインストール
しましたが、コンパイルできません。次の様なメッセージが出ます。
エラー E2209 sample.c 1:インクルードファイル’stdio.h’をオープン
できない。
警告 W8065 sample.c 4:プロトタイプの宣言のない関数'printh'の呼び出し
(関数 main
*** 1 errors in Compile ***
ソースファイルは
#include <stdio.h>
void main(void) {
printf("はじめまして");
}
どなたかよろしくお願いします。
0602デフォルトの名無しさん
2007/03/03(土) 07:46:48bcc32.cfg設定してない
等
そっから先はググレ
それが嫌なら、BCPad使え
0603デフォルトの名無しさん
2007/03/03(土) 07:51:16関数'printh'の呼び出し
printfですよ
0604デフォルトの名無しさん
2007/03/03(土) 08:29:59pathは通しました。でもできないんです・・・
0605デフォルトの名無しさん
2007/03/03(土) 08:34:45っ bcc32.cfg
bcc32.cfg.txt というオチか?
0606デフォルトの名無しさん
2007/03/03(土) 08:35:050607デフォルトの名無しさん
2007/03/03(土) 08:51:27602の2行目は?
0608デフォルトの名無しさん
2007/03/03(土) 09:15:45をコンパイルしたんですが、
警告 W8004 10-1.c 109: 'err' に代入した値は使われていない(関数 main )
と言われてしまいます。
原因がわからないので教えて頂けないでしょうか?
あと、void yesterdayの処理がもっとスマートになるならそれも教えて頂きたいです。
0609デフォルトの名無しさん
2007/03/03(土) 09:19:42ttp://www15.nikkeibp.co.jp/software/special/bcc_install/bcc_install.html
これでダメなら向いてない
0610デフォルトの名無しさん
2007/03/03(土) 09:34:200611デフォルトの名無しさん
2007/03/03(土) 09:36:58俺も駆け出しだから分からんけど
結果的に無意味な初期化だったっていうだけなんじゃない?
警告の「10-1.c 109」ってのは、109行目って意味のはずで
その直後のループ(最初にerrを扱う)ときにフラグOFFしてるから
最初の代入は何を入れても関係なくなる。
今回はたまたまどうでもいい警告なんだけど(実際、コンパイル通るし多分まともに動いてる)
本来は全く無駄な変数宣言を教えてくれたり
場合によっては誤作動を防ぐのに役立つ(はず)の警告なんじゃないのかと思う
中身はあんまり見てないけど、月ごとの最終日の配列をとった方がやりやすいんでにあ?
int last_date[] = { 31,28,31,30 ... };
//last_date[*m-1]でアクセス
if (閏年) last_date[1] = 29;
もし俺がとんちんかんなこと言ってたら、誰か指摘して下さい
0612デフォルトの名無しさん
2007/03/03(土) 09:40:210613デフォルトの名無しさん
2007/03/03(土) 10:00:51{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31},
};
if( *d == 1 ){
*d = days[IsLeepYear(*y)][(*m)-1];
if( --(*m) <= 0)(*y)--;
}else{
(*d)--;
}
こんなかんじ?
if( days[IsLeepYear(*y)][(*m-1)] == *d ){
}
0614デフォルトの名無しさん
2007/03/03(土) 10:05:40確かに最初の初期化をやめたら警告はでなくなるんですが、
フラグが働かないんですよね(aなどでも入力できる)(´・ω・`)
>>611,613
おおおっすごそうですね。
ありがとうございます。
0615デフォルトの名無しさん
2007/03/03(土) 10:10:03> フラグが働かないんですよね(aなどでも入力できる)(´・ω・`)
それに対応したいなら、scanf()のリターン値をチェックしないと。
それしないで、入力値のチェックしても、たまたま動いてるだけだし。
0616デフォルトの名無しさん
2007/03/03(土) 10:10:54これじゃダメなのか?
↓
int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
if (IsLeepYear(*y)) {
days[1]++;
}
if (*d == 1){
*d = days[(*m)-1];
if (--(*m) <= 0)
(*y)--;
}
else{
(*d)--;
}
0617デフォルトの名無しさん
2007/03/03(土) 10:12:31お騒がせしました(;´д`)ゞ
>>611,613
参考にさせていただきます。
0618デフォルトの名無しさん
2007/03/03(土) 10:15:47ちゃんとレスを見ろ
>>615の言う通り、
scanfの誤作動とフラグ初期化は一切関係ない
コードを順を追って嫁
まあ今回は警告無視しても問題は無いが、何が何でも警告出したくないなら
int err = 0;
で宣言してるんだからdo-whileループやめてwhile(COND)にすれば良いだけ。まあどうでもよいことだけど
scanfの誤作動に関しては、fgets sscanfとかググれば出る
0619デフォルトの名無しさん
2007/03/03(土) 10:27:36つ[time.h]
0620デフォルトの名無しさん
2007/03/03(土) 11:33:59>>594
た、単語も分からない場合は?
0621デフォルトの名無しさん
2007/03/03(土) 11:34:46なんのために辞書があるんだ?
0622デフォルトの名無しさん
2007/03/03(土) 11:36:55なんのためにgoogleがあるんだ。
0623デフォルトの名無しさん
2007/03/03(土) 11:41:38なんのためにgoggleがあるんだ
0624デフォルトの名無しさん
2007/03/03(土) 11:43:52C言語を理解するために英語が判る必要ない。
小学生や中学生だってプログラム書けるだろ。
int i;
for(i=0;i<5;++i)
を理解するうえでintやforの読み方を知っているほうが助かる。
しかし
for …するために、…するための、…用の、…を求めて、…に対して
なんて英語を知っていても役に立たないし、intなんて英語ないだろ。
0625デフォルトの名無しさん
2007/03/03(土) 11:46:450626デフォルトの名無しさん
2007/03/03(土) 11:52:05そういう話ではないと思う。
0627デフォルトの名無しさん
2007/03/03(土) 11:52:52これを知っていれば確かにintの理解が多少早まるかもしれないが
int a;
が説明なしでわかるわけじゃないし
英語じゃなくてC言語としてintがどういうものかそのとき覚えればいい。
C言語を理解するために(つまりC言語の前に)英語がわからなければ
いけないなんてことはほとんどない。
アルファベットを読めるくらいの知性は必要だろうけど。
0628デフォルトの名無しさん
2007/03/03(土) 11:53:320629デフォルトの名無しさん
2007/03/03(土) 11:53:510630デフォルトの名無しさん
2007/03/03(土) 12:05:56すると、そのヘッダファイルで宣言されている関数は、どこで定義されてるのでしょうか?
0631デフォルトの名無しさん
2007/03/03(土) 12:06:39#include <stdio.h>
void main(void) {
int a,b,sum;
printf("数値を入力して下さい\n");
scanf("%d",&a);
printf("入力された数値:%d",a);
printf("\n数値を入力して下さい\n");
scanf("%d",&b);
printf("入力された数値:%d",b);
sum = a + b;
printf("%d",sum);
}
2を二回入力すると4になるはずなのに24という合計になってしまいます。
なぜ??どこか間違ってますか?
0632デフォルトの名無しさん
2007/03/03(土) 12:10:11libcとかのライブラリ。
0633デフォルトの名無しさん
2007/03/03(土) 12:10:34って表示されてるオチじゃなく?
0634デフォルトの名無しさん
2007/03/03(土) 12:11:16改行してないから入力した2とくっついてるだけじゃねーの?
0635デフォルトの名無しさん
2007/03/03(土) 12:31:44そのライブラリ自体は、コンパイル済みですか?
0636デフォルトの名無しさん
2007/03/03(土) 12:35:30その通りでした!!
ありがとうございました!!
0637デフォルトの名無しさん
2007/03/03(土) 12:41:01あんたの言う事はいつも正しい
0638デフォルトの名無しさん
2007/03/03(土) 12:46:470639デフォルトの名無しさん
2007/03/03(土) 13:03:40いや待て、それは検証可能か?
0640デフォルトの名無しさん
2007/03/03(土) 13:16:42例えば、for (;;) printf("hello world\n");を
ふぉーかっこせみころんせみころんかっことじぷりんとえふかっこだぶるこーてーしょんはろーわーるどばっくすらえぬかっことじせみころん
と読むか、
えふおーあーるかっこてんてんのながいのてんてんのながいのはんたいかっこぴーあーるあいえぬてぃーえふかっこうえてんてんえっちいーいーえるえるおーだぶりゅーおーあーるえるでぃーえんえぬうえてんてんはんたいかっこてんてんながいの
と読むかの違いだな。
#後者は小6の甥っ子に読ませた。
0641デフォルトの名無しさん
2007/03/03(土) 13:27:27ふつうはlibc(やその同等品。Windowsだとなんて呼ぶのかは知らん)や
Cランタイム(ユーザーが定義したmainを呼び出すまでのアセンブラコード)は
コンパイル済みで、ユーザーがコンパイルしたソースを実行形式にする際に
自動的にリンク対象に加えられる。
0642デフォルトの名無しさん
2007/03/03(土) 13:36:070643デフォルトの名無しさん
2007/03/03(土) 13:38:22どういたしまして。
>>637
当然じゃないか。
>>638
余計なお世話だ。
>>639
検証するまでもないだろ?
>>642
何が言いたいんだ?
0644デフォルトの名無しさん
2007/03/03(土) 13:42:07実際自分がどう読んでいるかってよくわからない。
カッコ、カッコトジなんて初めて聞いたときは何じゃそれ
そうやって読むんかいなって思った。
人に口頭で説明するときに読むけど
"や;とかは自分がプログラムを書くときは読まないな。
文字だから"これを自然と描いている。
右脳の人は言葉で考えないんだってね。
0645デフォルトの名無しさん
2007/03/03(土) 13:47:28アルファベットの読み書きと言うとintをイント
と読むのではなくアイ、エヌ、ティーってわかればいいってこと?
0646デフォルトの名無しさん
2007/03/03(土) 14:14:41&とか#{[]}/<>!の正しい読み方を知るまでC言語がまったく
理解できないような障害になるわけじゃない。
今の時代は、googleで
お前らなんて読んでる?って聞くことも出来るし。
C言語より先に英語を習わないかたといって
charとかstrとかが絶対理解できないわけでもないし
中学になれば嫌でも英語を習うだろ。
そんなに気になるなら
お前の場合は英語が出来るようになってから
C言語やればいいよ。
人によって得て不得手や
学習方法に向き不向きがあるから。
0647デフォルトの名無しさん
2007/03/03(土) 14:15:59> 習わないかたといって
プププッ
0648デフォルトの名無しさん
2007/03/03(土) 14:16:440649デフォルトの名無しさん
2007/03/03(土) 14:19:500650デフォルトの名無しさん
2007/03/03(土) 14:21:29必要はないが、してはいけないわけでもない。
英語じゃなくてC言語としてintをイントと覚えるんだよ。
文字列つなぐstacatとか繰り返しforとか整数型intを
英語として覚えてどうなる。
お前の英語おかしいよって言われるだろ。
0651デフォルトの名無しさん
2007/03/03(土) 14:23:46英語が分からないとC言語はわからない
C言語が判るということは英語がわかるということだ
0652デフォルトの名無しさん
2007/03/03(土) 14:26:330653デフォルトの名無しさん
2007/03/03(土) 14:26:58C言語が分かる→英語が分かる は対偶の関係にあるので、
どちらかが偽なら他方も偽。どちらかが真なら他方も真。
0654デフォルトの名無しさん
2007/03/03(土) 14:31:12知らない単語の命令でてきても
英語の辞書で調べてもあまり役に立たないよ。
C言語の構文くらいなら日本語の説明ぐらいあるだろ。
C言語の標準関数なら日本語の説明ぐらいあるだろ。
高度な処理に手を出すころには
createやget,putぐらいの英語わかるようになっているだろうし
C言語自体はだいたい判ってきているから
『英語わかんねえとC言語理解するのは無理ですかねえ?』
なんて疑問はすっ飛んでるし
簡単な英語単語をいくつか知っているだけであり
英語を知っているとはいいがたい。
0655デフォルトの名無しさん
2007/03/03(土) 14:34:07パソコンで辞書とか使えるし楽な時代になったね。
パソコンで使える辞書が出たばかりのころは高価だった。
今じゃWebに無料辞書がある。
0656デフォルトの名無しさん
2007/03/03(土) 14:36:02それはさておき、その昔雑誌で堂々と「ポケ」って書くのはあまりに情けないと思ったもんだけどね。
#pokeってのはROM系basicにあったステートメント。C++なら差し詰めデレテってなもんだ。
0657デフォルトの名無しさん
2007/03/03(土) 14:38:08「ディレート」と読んでたので目眩がした。
0658デフォルトの名無しさん
2007/03/03(土) 14:47:46よくわかりました。ありがとう
0659デフォルトの名無しさん
2007/03/03(土) 14:49:27(a<b) ? a : b;
を
エーがビーより小さかったらエーでそうじゃなかったらビー
って心の中で言っている
と思う。
実際自分がどう考えているか改めて考えるとよくわからない。
0660デフォルトの名無しさん
2007/03/03(土) 14:51:16stringとかthreadなど
thread:糸
string:threadより太い糸
0661デフォルトの名無しさん
2007/03/03(土) 15:01:20#poke : (言葉に出来ない雰囲気)ポーク
(a<b) ? a : b; : エー<ビー、エー、エルス、ビー。不等号が頭の中でも変換されません。というか読んでません。
thread : 四角い何かから糸が沢山出てる
string : ストリング⇔文字列、ヨーヨーの糸
0662デフォルトの名無しさん
2007/03/03(土) 16:01:35判断してて、別に違和感覚えないんだから、stringにしろthreadにしろ、
その文脈での意味に解釈するだけだろ。
全く、その文脈に詳しくない人が見たら、奇異に見えるかもね。中学生が「信用取引」
って言葉を見て、「相手を信用して取引すること」っていうふうに意味を捉えるみたいな感じ?
0663デフォルトの名無しさん
2007/03/03(土) 16:04:44----+------+--→ なら a でそれ以外は b
0664デフォルトの名無しさん
2007/03/03(土) 16:45:33読み取るとき、ファイルの終わりに達したかどうかをfeof()で判定しても
問題ありませんか?
0665デフォルトの名無しさん
2007/03/03(土) 16:51:06feof()は単なるフラグを返すだけでeofか調べていないので
読み込みで指定サイズより少なかったらfeof()で判定する。
これバイナリとか不特定な大きさ関係ない。
ダトオモッタ。
俺って手抜きだから
読み込み失敗で原因を調べずに処理を終わりにしているので。
0666デフォルトの名無しさん
2007/03/03(土) 16:56:28規格読んでないから詳しいことわからないけど
ファイル終了指示子ってEOF以外の状態で変動する事は無いんじゃないの?
0667デフォルトの名無しさん
2007/03/03(土) 16:56:53読み込みんだサイズが指定したサイズより小さかったら、eofになってるはずだから、
どっちで判定しても同じなんじゃね?
0668デフォルトの名無しさん
2007/03/03(土) 17:04:32普通のバイナリファイルならないかも知れないが、名前付きパイプとかデバイスファイルとか、
OSによって特殊なファイルがあったりするからな。
0669デフォルトの名無しさん
2007/03/03(土) 17:07:49読む場合というのもあるか。
0670デフォルトの名無しさん
2007/03/03(土) 17:08:52みなさんありがとうございました。
いまいちよく分かりませんが、freadの返り値が指定したサイズより小さかったら、
異常終了なのかファイルの終端になったのかを判定するのは難しいらしい、
と理解しておきます。
0671デフォルトの名無しさん
2007/03/03(土) 17:13:37freadの返り値が0なら読み込み終わりにしているよ。
feofやferrorを見てない。
ただし
特殊なファイルとか
読み込み中にファイルサイズが増えたりするような
プログラムは組んでいないのでね。
それと読み込み中にハードディスクが
壊れるとか一切考えてない。
0672デフォルトの名無しさん
2007/03/03(土) 17:17:34一度0を返された後にもう一度freadしても成功するんだろうか。
0673664
2007/03/03(土) 17:35:57見れば十分、ということになるようです。
勉強になりました。
0674デフォルトの名無しさん
2007/03/03(土) 18:23:52しっかり何バイトリードしたかチェックしなさいって話は、見たことがある。
0675デフォルトの名無しさん
2007/03/03(土) 18:45:15俺は小学生からプログラミングやってる。
最初はBASICだったんだが
for→フォア
if→アイエフ
locate→ロカテ
delete→デレテ
width→ウィドティーエイチ
こんな英語力でも
スプライトとかファイル操作とかしてた。
アルゴリズムは拙いもんだったが
一応のループ制御はしてたし
関数定義も、何度かスタックオーバフロー(最初gotoみたいに使って無限再帰ループしてた)しつつ覚えたぞ。
0676デフォルトの名無しさん
2007/03/03(土) 18:47:10そこから英語のマニュアルも読むようになったし。
アルファベットを見慣れてたせいか
周りほど英語アレルギーは無かった。
0677デフォルトの名無しさん
2007/03/03(土) 18:47:47ってことでいいんじゃね?
0678デフォルトの名無しさん
2007/03/03(土) 19:22:28void main(void) {
int point[10] ;
int i, total ;
i = 0;
total = 0;
while(i < 10) {
printf("%d番目の点数:",i + 1);
scanf("%d",point[i]);
printf("%d",&point[i]);
total = total + point[i];
i++;
}
printf("合計:%d \n",total);
printf("平均:%d \n",total / 10);
printf("end");
}
コンパイルは成功するのですが、実行しようとすると
問題が発生したため、ex0501.exe を終了します。 ご不便をおかけして申し訳ありません。
この問題を Microsoft に報告してください。
というものが出てくるのですが、一体何ででしょう??
0679デフォルトの名無しさん
2007/03/03(土) 19:26:09scanf("%d",point[i]); → scanf("%d",&point[i]);
0680デフォルトの名無しさん
2007/03/03(土) 19:27:13→scanf("%d",&point[i]);
>printf("%d",&point[i]);
→printf("%d",point[i]);
まぁ、printfの方は、それはそれでも良いけど。
0681デフォルトの名無しさん
2007/03/03(土) 20:31:36一番簡単に出来ると思いますか?
ちなみに僕はC言語で簡単なプログラムが組めるぐらいのレベルです。
・翻訳ソフトの作成
・音楽編集ソフトの作成
・簡単にプログラムが組めるソフトの作成
・フラッシュを使ったHPの研究
・日本語変換機能の研究
0682デフォルトの名無しさん
2007/03/03(土) 20:34:570683デフォルトの名無しさん
2007/03/03(土) 20:39:47っ Hello,World!の表示
0684デフォルトの名無しさん
2007/03/03(土) 20:41:540685デフォルトの名無しさん
2007/03/03(土) 20:45:033 音楽編集ソフトの作成 (たぶん音楽ファイルとかの知識の方が必要)
2 簡単にプログラムが組めるソフトの作成 (適当に項目付けてポンポンポン)
1 フラッシュを使ったHPの研究 (研究ってのが引っかかるが)
5 日本語変換機能の研究 (日本語難しいぜ?)
>C言語で簡単なプログラムが組めるぐらいのレベル
具体的に書けよ
0686デフォルトの名無しさん
2007/03/03(土) 20:46:523番目が一番簡単だろうな。
他は全部プログラミング以外の研究が必要だ。
0687デフォルトの名無しさん
2007/03/03(土) 20:56:300688デフォルトの名無しさん
2007/03/03(土) 21:12:08あるいは、自然言語に興味があるなら、いきなり翻訳とか変換まで
行かずに、コーパスを解析して統計取るくらいでいんじゃね?
0689デフォルトの名無しさん
2007/03/03(土) 21:18:42・翻訳ソフトの作成→機械的に単語を置き換えていくだけか、製品レベルを目指すかで変わる。
・音楽編集ソフトの作成→波形編集レベルか、エフェクトか、はたまた圧縮技術研究レベルかで変わる。
・簡単にプログラムが組めるソフトの作成→単純なインタプリタ程度か、VBの頑張まくってるIDEレベルかで変わる。
・フラッシュを使ったHPの研究→どう研究するのかわからん
・日本語変換機能の研究→どこ目指しても大変。
0690デフォルトの名無しさん
2007/03/03(土) 21:22:080691デフォルトの名無しさん
2007/03/03(土) 21:30:090692デフォルトの名無しさん
2007/03/03(土) 21:31:560693デフォルトの名無しさん
2007/03/03(土) 21:45:54ジェネレータ作りたいってことでは?
0694デフォルトの名無しさん
2007/03/03(土) 21:56:02自分はC言語しかできません。
しかも出来るといっても四則演算や簡単なカードやダイスのゲーム
が作れるくらいの実力しかありません。
C言語入門の本を1冊勉強したくらいです。
みなさんの意見を参考にさせていただくと1,2,3番目のどれかに
したほうが良さそうな感じですね。
自分としては翻訳ソフトや音楽ソフトをやるなら市販のものなどには
全然かなわないが自分なりの工夫がしてあるソフトが出来ればいいな
と思っています。
簡単にプログラムが組めるソフトというのはプログラミングが何も
わからない文系の人でもプログラムが組めるようなものを作りたいと思っています
そう考えるとどうでしょうか?
ちなみに英語は人並みに日常会話が出来る程度ですし、音楽ファイルの形式
などの知識はほとんどありません
0695デフォルトの名無しさん
2007/03/03(土) 22:00:470696デフォルトの名無しさん
2007/03/03(土) 22:02:26なのに
>プログラミングが何もわからない文系の人でもプログラムが組めるようなもの
なんてどうがんばったって無理だと思うのだが・・・
0697デフォルトの名無しさん
2007/03/03(土) 22:09:520698デフォルトの名無しさん
2007/03/03(土) 22:16:59どうみても初心者。とりあえずどれかやってみるといいよ
0699デフォルトの名無しさん
2007/03/03(土) 22:20:370700デフォルトの名無しさん
2007/03/03(土) 22:47:070701デフォルトの名無しさん
2007/03/03(土) 23:18:53>文系の人でもプログラムが組める
プログラムは手順を書き綴ったものでしかないよ。
プログラムの基本は自然言語の翻訳と同じで、「こう書けば相手が
どういう風な理解をするか」を念頭におきながら記述する。
プログラム自体は純粋な文系。
0702デフォルトの名無しさん
2007/03/03(土) 23:37:310703デフォルトの名無しさん
2007/03/04(日) 00:05:53これやってみなよ。俺もPascalを真似た架空の言語仕様を作って、
そのソースコードからアセンブラコード出力するコンパイラを
学生時代作ったことある。割と大きなプログラムになるから経験としても悪くないし、
Cの基礎の復習や構文解析の良い勉強になるよ。
0704デフォルトの名無しさん
2007/03/04(日) 01:54:16main(){
int a[] = {9,8,7,6,7};
int n = 0, i;
for(i = 0; i<5; i++){
if(a[i] == 7){
printf("7があったよ\n");
n = 1;
break;
}
}
if(n == 0)
printf("7はなかったよ\n");
return 0;
}
に於いて、n = 1; とはどういう意味でしょうか?
これがあるとどうなるのでしょうか?
0705デフォルトの名無しさん
2007/03/04(日) 01:59:13>printf("7はなかったよ\n");
に注目。
n=1 を通れば、printf("7はなかったよ\n");
は実行されない。
n=1 を通らなければ、printf("7はなかったよ\n");
は実行される。
0706デフォルトの名無しさん
2007/03/04(日) 02:03:08ありがとうございます。
if(1 == 0)
こうなるからでしょうか?
0707デフォルトの名無しさん
2007/03/04(日) 02:08:20なにコレ?
どこら来たの?
0708デフォルトの名無しさん
2007/03/04(日) 02:09:20○どこから来たの?
脱字、失礼した
0709デフォルトの名無しさん
2007/03/04(日) 02:09:20でn=1の時の話だろ
よく読めよ
0710デフォルトの名無しさん
2007/03/04(日) 02:10:280711デフォルトの名無しさん
2007/03/04(日) 02:28:340712デフォルトの名無しさん
2007/03/04(日) 02:31:200713デフォルトの名無しさん
2007/03/04(日) 02:54:04forの中のifはあった場合の処理
後のifはなかった場合の処理
0714デフォルトの名無しさん
2007/03/04(日) 04:00:31サンクスですた
C言語って、1や0が多く困ります
0715デフォルトの名無しさん
2007/03/04(日) 04:10:110716デフォルトの名無しさん
2007/03/04(日) 04:28:26#include <string>
main(){
int i, n;
char a[] = "DOG";
char b[10];
n = strlen(a);
for(i = n-1 >= 0; i--)
b[n-1-i] = a[i];
b[n] = '\n';
printf("%sは\n逆さから読むと\n%s\n",a,b);
return 0;
}
この中でわからない事がありますので
ご返答、宜しくお願い致します。
>>for(i = n-1 >= 0; i--) の中の
i = n-1 >= 0; は特に0は何を指すのでしょうか?(どういう意味か)
>>b[n-1-i]
"-i"←これがわかりません。
本の解説に依れば、a[i]に対応する、bの要素と書かれていますが
何の事やらわかりません。
0717デフォルトの名無しさん
2007/03/04(日) 04:53:34まずは、その本と自分が書いたソースをよく見比べてみて
話しはそれからだ。
0718デフォルトの名無しさん
2007/03/04(日) 09:04:56じゃあ
n=2とか
if(n==5)ならいいのか?
というのは冗談で;
どこから>>704のソースを見つけたのか知らないが
今の時代こういうプログラムは悪い例だよ。
判りやすい変数名
それでも説明不足ならコメントを付ける。
以下はあまりいい例じゃないけど;
int found = 0; /* 見つけたら0以外 */
bool isFound = false; // bool型が使える言語の場合
0719デフォルトの名無しさん
2007/03/04(日) 09:14:03> for(i = n-1 >= 0; i--)
俺もわからない。
>この中でわからない事がありますので
ということはnがaの(文字列の終端0を除く)バイト数
n=3;
を示すことはわかるよね。
> char a[] = "DOG";
ということは
a[0]=='D';
a[1]=='O';
a[2]=='G';
a[3]==0;
ということになる。
> for(i = n-1 >= 0; i--)
>b[n-1-i] = a[i];
i--なのでiはforループを回るたびに小さい値に変化して行く。
文字順序を逆さにするのが目的。
よって
b[0]=a[2];
b[1]=a[1];
b[2]=a[0];
b[3]=0;
を実行したいものと推測する。
0720デフォルトの名無しさん
2007/03/04(日) 09:16:13作った人が「見つかったことをn==1で、
見つからなかったことをn==0で表す」と決めただけ。
>>718も言ってるが、
そういう判断につかう変数にnという無意味な名前を付けることや、
生の数字をこういう形で使うのは質の悪いプログラムとされてる。
0721デフォルトの名無しさん
2007/03/04(日) 09:22:46つづき
> for(i = n-1 >= 0; i--)
forの記述がわからないのでi=0と仮定して
> b[n-1-i] = a[i];
n=3だから
b[3-1-0] = a[0];
b[2] = a[0];
となる。
>>719に書いた俺の予測に一致する。
これは単なる動作確認です。
要するに
> b[n-1-i] = a[i];
が
b[0]=a[2];
b[1]=a[1];
b[2]=a[0];
となるようにforを書く。
つまりiが2から始まり0まで(0含む)繰り返すことなので
for(i=2; i>=0; --i)
そして2は文字の長さで決まる値なので
for(i=n-1; i>=0; --i)
俺はこれが正しいforだと考えた。
0722デフォルトの名無しさん
2007/03/04(日) 09:30:19つづき
> >>b[n-1-i]
> "-i"←これがわかりません。
これはつまり省略しないで書くと
> b[n-1-i] = a[i];
> "-i"←これがわかりません。
という質問ですね。
もしaの方がa[i]なら
bの方はiの引き算にならないと
文字の並び順が逆にならないでしょ。
0723デフォルトの名無しさん
2007/03/04(日) 09:42:39もちろん結論としては正しいのだが、
for (hoge; fuga; i--)
piyo = a[i];
で、「どう考えても i=0; で初期化するとマズイ」
という注釈も付け加えて欲しかった。
0724デフォルトの名無しさん
2007/03/04(日) 13:47:33度々質問なのですが翻訳ソフトを作るとしたら
実際どのように作っていけばよいのでしょうか?
C言語しか出来ないんですが、どんな感じではじめればよいのでしょうか?
0725デフォルトの名無しさん
2007/03/04(日) 13:59:530726デフォルトの名無しさん
2007/03/04(日) 14:07:58もはやC言語関係ないから、機械翻訳に関する論文を片っ端から読め
0727デフォルトの名無しさん
2007/03/04(日) 14:08:02英語→日本語と日本語→英語で
随分と難易度が変わる気がするぜ。
0728デフォルトの名無しさん
2007/03/04(日) 14:09:35足し算を覚えたての幼稚園児に、
「さんかくかんすーってのをけんきゅうしたいんだけど、なにからはじめたらいいの?」
って聞かれたらどうする?
ってくらいのレベルのことをあなたはやろうとしてるのですが、
その自覚はありますか?
0729デフォルトの名無しさん
2007/03/04(日) 14:27:52実力がなくても1年あれば何とかなると思っています。
どなたか作り方の概要を教えてもらえませんでしょうか?
0730デフォルトの名無しさん
2007/03/04(日) 14:30:080731デフォルトの名無しさん
2007/03/04(日) 14:30:32http://ja.wikipedia.org/wiki/%E6%A9%9F%E6%A2%B0%E7%BF%BB%E8%A8%B3
0732デフォルトの名無しさん
2007/03/04(日) 14:38:100733デフォルトの名無しさん
2007/03/04(日) 15:04:460734デフォルトの名無しさん
2007/03/04(日) 15:08:071.英文法を解析するパーサーを作る
2.ひたすら英単語の訳を入力する
3.できるだけ自然な日本語に出力するロジックを組む
大雑把にはこんなもんだろうが初心者が一年で出来るとはとても思えん
パーサーはboost::spiritから作るとか、HTMLパーサーやインタープリタ
を参考にさせてもらうとかすれば?
もちろん英語は苦手ではないか、または克服する気ぐらいあるんだろ
苦手とか言ってたら一生作れねー
まー、打算の匂いがぷんぷんするんだが
0736デフォルトの名無しさん
2007/03/04(日) 15:35:520737デフォルトの名無しさん
2007/03/04(日) 16:10:14プログラミングの研究以外の事に時間を取られる。
0738デフォルトの名無しさん
2007/03/04(日) 16:40:42ただこれは自力でアルゴリズムを考えるんじゃなくて、既知のアルゴリズムを勉強しないといけない。
天才でもない限り自力じゃ考え付くのは無理。出来たとしても途方もない時間がかかるかどっかに穴が出来たりする。
再帰下降構文解析なら考え方的にもわかりやすいからCの基礎を知ってるだけで実装も容易だし、
割と幅広い構文仕様に使えるから(言語仕様にも依るけど)多くのコンパイラや翻訳機に適用できる。
色んな本出てるから機械翻訳に興味あるならその辺探してみるといいよ。
0739デフォルトの名無しさん
2007/03/04(日) 17:03:49C言語すら満足に扱えているかどうか…。
下手するとインタープリタとかアルゴリズムとかの
基本的な用語すら理解出来なさそうだから怖い。
0740デフォルトの名無しさん
2007/03/04(日) 17:20:14それである程度の言語を作って卒研としたな。
まあ、そいつはかなりセンスのある奴だから良かったけど、
>>724 にはどうなんだろうね?
0741デフォルトの名無しさん
2007/03/04(日) 17:31:25センスのあるヤツの質問は、見れば分かるでしょ。
というか、センスのあるヤツは
・何か構文を解析する手段が必要らしい
・だが、具体的な手法についての知識が不足している
くらいは、自分で分かっていると思うが。
初っぱなから丸投げするヤツのセンスは信じられない。
0742デフォルトの名無しさん
2007/03/04(日) 17:38:17判断できないんじゃなかろうか。
おれも>>740のような同じ立場の状況でに出会ったときがあるし、だからこそ
>>724の半分ネタで半分センス抜群のどっちに転ぶか生暖かく見守るよ
0743デフォルトの名無しさん
2007/03/04(日) 17:46:290744デフォルトの名無しさん
2007/03/04(日) 17:51:090745デフォルトの名無しさん
2007/03/04(日) 17:54:040746デフォルトの名無しさん
2007/03/04(日) 18:03:21取り敢えず辞書ファイル使って品詞分解して、当てはまる文型に従って日本語に置換すれば?
つかスレ違いだろ。死ね!!!
0747デフォルトの名無しさん
2007/03/04(日) 18:05:16これはひどいツンデレ
0748デフォルトの名無しさん
2007/03/04(日) 18:06:380749デフォルトの名無しさん
2007/03/04(日) 18:09:09ソケット使えればなんとかなりそうだ
0750デフォルトの名無しさん
2007/03/04(日) 19:15:49センスがあまり感じられないから
奨めるのは難しいかもしれんね、
というニュアンスで言ったのだが。
0751デフォルトの名無しさん
2007/03/04(日) 19:18:27プログラミングを完全に舐めてるか
自己を過大評価してるかのどちらか。
0752デフォルトの名無しさん
2007/03/04(日) 20:23:320753デフォルトの名無しさん
2007/03/04(日) 20:27:210754デフォルトの名無しさん
2007/03/04(日) 20:35:05スレがスレだけに724のようなやつもたまには降ってくるよ
0755デフォルトの名無しさん
2007/03/04(日) 20:48:03文面では叩いて、怒ってる様に見えても、
心は春の野の花のごとく…幸福感に満ちあふれている件。
0756デフォルトの名無しさん
2007/03/04(日) 21:12:130757716
2007/03/04(日) 22:55:26>>719
>>720
>>721
>>722
詳しく丁寧なご返答、ありがとうございました。
お陰様で概ね理解できましたが
>>722
>>もしaの方がa[i]なら
bの方はiの引き算にならないと
文字の並び順が逆にならないでしょ。
>> b[n-1-i] = a[i]; の-iが
今一わかりません、どうして-iが付くのでしょうか?
0758デフォルトの名無しさん
2007/03/04(日) 22:58:43例えば n=10 として
i に 9 から 0 まで順に入れていってみ?
i=9 のとき b[10-1-9] = a[9] → b[0] = a[9]
i=8 のとき …
0759デフォルトの名無しさん
2007/03/04(日) 23:04:120760716
2007/03/04(日) 23:10:32i=9 のとき b[10-1-9] = a[9] → b[0] = a[9]
i=8 のとき b[10-1-8] = a[1] → b[1] = a[8]
i=7 のとき b[10-1-7] = a[2] → b[2] = a[7]
i=6 のとき b[10-1-6] = a[3] → b[3] = a[6]
i=5 のとき b[10-1-5] = a[4] → b[4] = a[5]
i=4 のとき b[10-1-4] = a[5] → b[5] = a[4]
i=3 のとき b[10-1-3] = a[6] → b[6] = a[3]
i=2 のとき b[10-1-2] = a[7] → b[7] = a[2]
i=1 のとき b[10-1-1] = a[8] → b[8] = a[1]
i=0 のとき b[10-1-0] = a[9] → b[9] = a[0]
お〜逆になっています、とても不思議ですね
解りました!!サンクスです。
0761デフォルトの名無しさん
2007/03/04(日) 23:15:340762デフォルトの名無しさん
2007/03/04(日) 23:16:470763デフォルトの名無しさん
2007/03/04(日) 23:35:550764デフォルトの名無しさん
2007/03/04(日) 23:38:220765デフォルトの名無しさん
2007/03/05(月) 00:00:59調べ物が出来ない人は中々上達しないよな
0766デフォルトの名無しさん
2007/03/05(月) 00:34:58おかしな点があったら手直しをお願いします。
#include <stdio.h>
void main(void){
int c1,c2,c3,s1,s2,s3,h,i,x1,x2,x3,y1,y2,y3;
printf("x=");
scanf("%d%d%d",&x3,&x2,&x1);
printf("y=");
scanf("%d%d%d",&y3,&y2,&y1);
s1=x1^y1;
c1=x1&y1;
h=x2^y2;
s2=h^c1;
c2=x2&y2|h&c1;
i=x3^y3;
s3=i^c2;
c3=x3&y3|i&c2;
printf("s=%d%d%d%d\n",c3,s3,s2,s1);
}
0767デフォルトの名無しさん
2007/03/05(月) 00:39:24入力チェックで 01 意外はエラー
ぱっと見でそんくらいしか思いつかんが
0768767
2007/03/05(月) 00:42:52文字列で読み込んで一文字ずつ取った方が確実なのかな
0769デフォルトの名無しさん
2007/03/05(月) 00:45:110770デフォルトの名無しさん
2007/03/05(月) 00:45:390771767
2007/03/05(月) 01:05:02while (1) {
printf("x= ");
fgets(buff, 8, stdin);
sscanf(buff, "%1d%1d%1d", &x3, &x2, &x1);
if (x1>=0 && x1<=1 && x2>=0 && x2<=1 && x3>=0 && x3<=1)
break;
printf("やり直し ");
}
s1 = x1 ^ y1;
i = x1 & y1;
s2 = x2 ^ y2 ^ i;
i = (i) ? (x2 | y2): (x2 & y2);
s3 = x3 ^ y3 ^ i;
i = (i) ? (x3 | y3): (x3 & y3);
0772デフォルトの名無しさん
2007/03/05(月) 01:08:51buffが適切に確保されていれば問題ないと思うよ
>>766
void main()はやめれ
0773デフォルトの名無しさん
2007/03/05(月) 01:12:36sscanf()の戻り値見ていないから、その次のifでのx1, x2, x3が不定値になりうる。
0774デフォルトの名無しさん
2007/03/05(月) 01:26:59void swap(int *, int *);
void sum(int, int);
main(){
sum(1,5);
sum(10,5);
sum(1,10);
sum(2,2);
void swap(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
0775774
2007/03/05(月) 01:28:33int i, n;
if(min > max)
awap(&min, &max);
printf("%d",min);
n = min;
for(i = min+1; i <= max; i++){
printf("+%d", i);
n += i;
}
printf("=%d\n", n);
printf("%dから%d%までの和はd%\n", min, max, n);
}
return 0;
}
0776デフォルトの名無しさん
2007/03/05(月) 01:29:06そんなことするより1文字ずつ取り出したほうがいい
0777デフォルトの名無しさん
2007/03/05(月) 01:32:28レスありがとうございます。
うーん、よくわからない・・・
>>772
何にしたら良いのですか?
0778774
2007/03/05(月) 01:33:24このポインタは、どれを指すのでしょうか?
sum(1,5);
sum(10,5);
sum(1,10);
sum(2,2);
等のアドレスでしょうか?
>>int temp;
temp = *a;
*a = *b;
*b = temp;
で何をどう交換してて、交換する意味を教えて下さい。
>>if(min > max)
のminとmaxとは、何の事なのでしょうか?
>>awap(&min, &max);
これは、どういう意味でしょうか?
>>for(i = min+1; i <= max; i++) の min+1; とは・・・?
これら解説が一行もなく、さっぱりですので、
ご助言、戴ければ幸いです。宜しくお願い致します。
0780デフォルトの名無しさん
2007/03/05(月) 01:34:40mainの返り値型は必ずint
0781デフォルトの名無しさん
2007/03/05(月) 01:48:37sum()内の変数minとmaxのアドレス。
アドレスaにある数値ととアドレスbにある数値を交換。交換それ自体に意味は無い。
なんで交換してるかはそれを呼び出した関数側の問題。
この場合は二つの数値で小さい順にするために条件付で交換している。
最小値から最大値までを合計するときに合計の値nに最初にminを入れてるから
二重にminを足さないためにmin+1からにしてる。
0783デフォルトの名無しさん
2007/03/05(月) 02:23:58というか、まずは実行して見ればどうなるのか分かるのに
0784766
2007/03/05(月) 02:33:180785デフォルトの名無しさん
2007/03/05(月) 02:56:580786デフォルトの名無しさん
2007/03/05(月) 03:14:50多分、110 + 101 とかは
x=110
y=101
みたく入力したいのだろう、とは分かるけど
scanf("%d%d%d",&x3,&x2,&x1); のままやると、x3 に 110 とか格納される
あと、範囲チェックしてないので
x=190 y=721
とかも計算してしまう
x=a とか x=3.2
なんかすると、暴走することもある
バッファ溢れ……はまあいいか。
このレスの後半で何言ってるか分からんようなら、取り敢えず
scanf("%1d%1d%1d", &x3...);
ってやって、正確なデータ以外入力しなければ良い。
0787774
2007/03/05(月) 04:19:43むずかし過ぎます・・・・
0788デフォルトの名無しさん
2007/03/05(月) 04:54:42どうでもいいけどちゃんと写せてる?
0789デフォルトの名無しさん
2007/03/05(月) 05:02:39何を読んでそうなったんだ?
例えば「やさしい入門書」を謳っているもの等で、初心者が尻込みしないように用語の記述なんかを略した結果
必要なことすら書いてなくて、余計分かりにくくなったと言うモノもある。
それとも、単に>>781の内容が難しくて読めません、ということか?
例えば sum(10,5); と関数を呼んだ場合、
min = 10
max = 5 が入る。
もしこのままswap関数を呼ばないと、sum関数内のforループで
for (i=11; i<=5; i++) で、足し算をせずにループ終了してしまう。
そうならないように、swap関数で、min <= max となるように入れ替えている。
それ以上のポインタについて知りたいなら、ちゃんとした本読め
>for(i = min+1; i <= max; i++) の min+1;
コレに関しては、例えばすぐ上の行に
n = min; があるから。
n = 0; → for(i=min; i<=max; i++) でも一緒。
こういうことは、関数の一番上から適当なnなんかを入れて、順に手動で計算していけばどうなるのか分かる
とういか、そんな本は今すぐ窓から投げ捨てて
もうちょっと分厚い参考書買え、とか思うがなあ
0790774
2007/03/05(月) 05:36:57まだ、実行はしていません(内容を理解するのに時間を割いてしまっていて・・・・)
>>789
本は入門書を謳っている割には解説もなく(サンプル)
いきなりサンプルで高度になるんです。
しかも、説明も薄い内容だと思います。
解説ありがとうございました。
あとは自力と解説で何とかやってみます。
0791デフォルトの名無しさん
2007/03/05(月) 07:18:16お前さんは勉強の仕方を間違えてる。
0792デフォルトの名無しさん
2007/03/05(月) 07:35:47>>791 は、まあ動けばいいや、
という姿勢に転んじゃうやつも問題あるんで注意しておくと、
動いているところを見たほうが、理解が進む、という意味だからね
0793デフォルトの名無しさん
2007/03/05(月) 08:12:280794デフォルトの名無しさん
2007/03/05(月) 08:47:11逆じゃね?
あふぉな入門書もあるから、>>774みたいなのの割合が増えるんだよ。
まあ、原因が分かってるのに本屋にも図書館にも行かない
っていうのはかなりどうかと思うけど菜
0796デフォルトの名無しさん
2007/03/05(月) 09:50:41OSの機能か、バイナリーを自前で移すしかないの?
0797デフォルトの名無しさん
2007/03/05(月) 09:52:59配列で、効率的にメモリ確保をしたいのですが、どうやればいいでしょうか。
具体的には
・・・・・・・・・・・・・・・
・・・・・・・・・・・ ・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・
こういう座標群があったとして、それを配列に確保していきたいのです。
point[x][y]のように宣言して、左上から値がなかったら0 あったら1のように確保していくと
無い部分のメモリが無駄に取られてしまうので
座標がある部分だけ、確保したいのです。
図は二次元ですが、それを3次元でやりたくて、そこで詰まっています。
ご指南お願い致します
0798デフォルトの名無しさん
2007/03/05(月) 10:09:13sparse(スパース/疎な) arrayとかmatrixで探してみるといいかもしれない。
0799デフォルトの名無しさん
2007/03/05(月) 10:14:52それと同じように配列についてですが
BMPのように大きさが様々なデータを配列に読み込む場合に
その大きさちょうどのサイズを宣言したいのですが。。。どうすればいいのでしょうか
可変型の配列とかありますでしょうか
0800デフォルトの名無しさん
2007/03/05(月) 11:00:37C++ならvectorを使うと言う選択肢もあるけど、このスレ的には可変長配列はない。
厳密にはC99にならあるのだが画像処理には向かないし、
一般的にはmalloc()で適宜確保した一次元空間を二次元的に使うのが無難かな。
0802デフォルトの名無しさん
2007/03/05(月) 11:06:33なかなか中途半端なコテだなぁ。
そもそもalloc()ってなんだよ。
0803デフォルトの名無しさん
2007/03/05(月) 11:15:47size_t at(size_t w, size_t h) { return W * h + w; }
とかは?
for (int w = 0; w < W; ++w) {
for (int h = 0; h < H; ++h) {
array[at(w, h)] = 0;
}
}
みたいに使う
0804デフォルトの名無しさん
2007/03/05(月) 11:21:51いや、>>802はわかってるんだろうけど。
0805デフォルトの名無しさん
2007/03/05(月) 11:23:42普通はこうした方が引き数の名前が理解しやすいしパフォーマンスも期待できるな。
つーか、W固定じゃ可変長にできないじゃん。
int at(int x, int y, int width) {return x + y * width;}
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
array[at(x, y, width)] = 0;
}
}
size_tかintかは難しい問題だけどsize_tが64bitだと泣けるからunsignedで妥協とかもありかも。
0806デフォルトの名無しさん
2007/03/05(月) 11:25:43それだと結局2次元配列のCでの実装と同じことを手動でやってるという
落ちにならんか?
>>797のような、0でない要素が全体に対して少なめ(疎)と思われるデー
タに対しては、ナイーブな実装だとメモリ効率が悪くなる。
100×100×100の座標空間だけで100万要素だしな。
0807デフォルトの名無しさん
2007/03/05(月) 11:31:01さてどっちかのう。
0808デフォルトの名無しさん
2007/03/05(月) 13:09:14>797 は、うまく取り扱うのに どういう構造が向いているか? っつー話だし
>799 必要なバイト数が事前にわかるから、 allocation 後キャストして参照だろ
0809デフォルトの名無しさん
2007/03/05(月) 13:42:14たくさんのご解答ありがとうございます。
>>807
そのどちらもなのです。
ボクセルのような3Dデータを扱うことと
BMPの2次元配列のような、様々な大きさのグリッドにあるデータを処理しなくてはならなくて
前者は>>806さんの仰るように、100×100×100をとったりするとメモリ効率が悪くなって行き詰まり
後者は大きさが可変したときに配列の扱いがわからなくなってしまい、質問させていただきました
頂いたレスを熟読して、検討してみます
本当にありがとうございました。
0810デフォルトの名無しさん
2007/03/05(月) 14:02:50ret_val = Get(handle, x,y,z) と Set(handle, x,y,z,val) で抽象化したあと
Get/Set の実装をどうするべか? って悩むほうが良いと思うが。
# 結果的に配列実装だった。 というのはありえるけど
0811デフォルトの名無しさん
2007/03/05(月) 20:30:39Visual C++ 2005 Express EditionはC++だけでなく、C言語のソースもコンパイルできるのでしょうか。
0812デフォルトの名無しさん
2007/03/05(月) 20:39:47できるよ。
0813デフォルトの名無しさん
2007/03/05(月) 20:39:59コンパイルできるよ。
C++はC89あたりなら、ほぼ上位互換だから、入門書にのってるソースを打ち込んで
動作を見る程度なら、コンパイルできなくても困らないと思うけど。
あと、べつにC++のまえにCをやる必要もないと思うし。
0814デフォルトの名無しさん
2007/03/05(月) 20:50:22滅茶苦茶速いレスありがとうございました。
0815デフォルトの名無しさん
2007/03/05(月) 21:00:22> あと、べつにC++のまえにCをやる必要もないと思うし。
確かに、必要はないが、C++の入門書はC言語の知識をある程度持っている
ことを前提としている本が多いのが現実orz
初心者が予備知識なしで独習できるのは、今の日本だとCとJavaくらい
ではなかろうか?
0816デフォルトの名無しさん
2007/03/05(月) 21:26:38どのようなinclude命令や関数を使ってよいのか見当が付きません。
見本になるようなコードが掲載されているサイトなど、アドバイス頂けないでしょうか?
0817デフォルトの名無しさん
2007/03/05(月) 21:34:30・ドラッグ&ドロップの情報の受け取り方
・先頭部分を削除する方法
前者は環境依存
後者はただのファイル操作
0818デフォルトの名無しさん
2007/03/05(月) 21:36:40ターゲットは当然Windowsだよな?問題を分割するんだ。プログラムにファイル名をドラッグアンドドロップで
受け渡す方法、ファイルを読み込む方法、一部を除いて別のファイルに書き出す方法、というように。
その上でそれぞれの処理を実装してみてわからないことはまたそれなりのスレで質問する。
0819デフォルトの名無しさん
2007/03/05(月) 21:49:47D&Dの処理はOSに依存
0820819
2007/03/05(月) 21:52:04↑なので
WindowsならWin32APIで
DragAcceptFiles
DragFinish
DragQueryFile
あたりを調べようね
以上でし
0821816
2007/03/05(月) 21:53:02なるほど、そんな方法を分割してという噛み砕いた考え方が出来ませんでした。
今、参考書にやさしいCと言うのを使っていますが、まだ、変数や式、演算子までしか学んでいません。
お二方アドバイスありがとうございます。関数などまで、もう少し熟読してみます。
0822デフォルトの名無しさん
2007/03/05(月) 21:54:45それはWindowへのドラッグ&ドロップやろ。
0823デフォルトの名無しさん
2007/03/05(月) 21:54:51Windowsとして回答。
実行中のファイルだと
その実行ファイルが出したウィンドウへドロップということになる。
エクスプローラに表示されている*.exeファイル上へのドロップでは
ファイル名はコマンドライン引数で渡されるので
int main(省略)のargv[1]にファイル名が入っているよ。
スペースが入っていたり"で囲まれていたりいなかったりしても
動作するか確認するべし。
0824816
2007/03/05(月) 22:13:25あっそうだった
>>821
int main(int argc, char* argv[])
{
int i;
for(i=1;i<argc;i++)
{
argv[i] ←D&Dしたファイル名がchar* で入ってますにょ
}
0826デフォルトの名無しさん
2007/03/05(月) 22:37:30ファイルの先頭削除っていったら
やっぱファイル全体の作り直しかな。
0827デフォルトの名無しさん
2007/03/05(月) 22:41:530828816
2007/03/05(月) 22:45:03ttp://homepage1.nifty.com/MADIA/vc/C/c_lang_3_4.htm
見本まで書いて頂いて勉強になります。
アイコンにドラッグ&ドロップする時は必ずこういう書式になるという風に覚えておいたら問題ないんでしょうか?
void main(int argc,char *argv[])
{
実行文
・
・
}
次に、ファイルを読み込む方法を調べてみます。
0829デフォルトの名無しさん
2007/03/05(月) 22:45:140830819
2007/03/05(月) 22:53:49>アイコンにドラッグ&ドロップする時は必ずこういう書式になるという風に覚えておいたら問題ないんでしょうか?
はい
ただ常にそーいう書式のほうが良いですよ
特殊な環境でなければ
0831デフォルトの名無しさん
2007/03/05(月) 22:55:52↓よりすっきりした方法ないでしょうか?
wd = (( BYTE ) * ( LPDBYTE * ) &cmd ) & 0xff;
0832デフォルトの名無しさん
2007/03/05(月) 22:56:58そんなことすんなよ。。。
0833デフォルトの名無しさん
2007/03/05(月) 23:02:25面倒だから動作確認していないごめんね。
そもそもビットフィールドだから上手く行くか俺は興味ない。
0834831
2007/03/05(月) 23:13:51出来ました。
有り難うございます。
ハードの制御(ビット単位のON/OFF)だとビットフィールドは便利なんですが、
あまり使わない方が良いのでしょうか?
0835デフォルトの名無しさん
2007/03/05(月) 23:15:40コンパイラによって動作が変わるから
それを知ってやっているならいいんじゃね。
俺に取っちゃ人事だし。
0836831
2007/03/05(月) 23:25:14了解です。有り難うございました。
正式なソフトウェアは本職の人が組みますし、
私はハードの動作確認ができれば良いので支障はないと思います。
0837デフォルトの名無しさん
2007/03/05(月) 23:36:44もうちょっと面白いこと言えませんか?
0839デフォルトの名無しさん
2007/03/06(火) 00:08:440840デフォルトの名無しさん
2007/03/06(火) 00:32:55そいつは盲点だった。そんなクールな実現手段があったとは!
0841デフォルトの名無しさん
2007/03/06(火) 00:35:350842デフォルトの名無しさん
2007/03/06(火) 01:13:06感動した!
0843デフォルトの名無しさん
2007/03/06(火) 03:47:55char型文字列の最後の\0を指すポインタを作るには
while(*a != '\0')
a++;
と、whileを使ってこんな風にするしか方法は無いのだろうか?
0844デフォルトの名無しさん
2007/03/06(火) 03:56:50と書いてもいいが、好き嫌いは分かれる。
strlenを使うと、中でやってることは同じだが、見やすさは違うかも。
(char型文字列というのはwchar_tとかを意識した表現?)
0845デフォルトの名無しさん
2007/03/06(火) 03:58:08見なかったことに。
0846デフォルトの名無しさん
2007/03/06(火) 04:18:090847デフォルトの名無しさん
2007/03/06(火) 04:39:24あまり良くないと聞きますが、良くないのでしょうか?
特に初心者には・・・
0848デフォルトの名無しさん
2007/03/06(火) 04:44:28勉強なんてやってられんよ。
0849デフォルトの名無しさん
2007/03/06(火) 04:46:180850デフォルトの名無しさん
2007/03/06(火) 04:52:03説明されているはずなので、それを参考に自分で判断すべし
理由も挙げずに単に良くないって言ってるだけだったら
そんな発言は無視しとけ
0851デフォルトの名無しさん
2007/03/06(火) 04:52:24C言語スタートブックと言う参考書を買いやっていますが(もう終盤)
Cってこういう感じなのか程度で内容はさっぱり、わかりませんでした
最初はこんな感じでいいのでしょうか?
0852デフォルトの名無しさん
2007/03/06(火) 04:55:26明日、本屋で見てきます。
ネットで評価見ると、内容が薄いとか説明が不足しているとかで不評でした。
0853デフォルトの名無しさん
2007/03/06(火) 05:38:01>>853
もうちょっと面白いこと言えませんか?
840 名前:デフォルトの名無しさん[sage] 投稿日:2007/03/06(火) 00:32:55
>>853
そいつは盲点だった。そんなクールな実現手段があったとは!
841 名前:デフォルトの名無しさん[sage] 投稿日:2007/03/06(火) 00:35:35
>>853やっぱおめぇすげぇよ!!
842 名前:デフォルトの名無しさん[sage] 投稿日:2007/03/06(火) 01:13:06
>>853
感動した!
0854デフォルトの名無しさん
2007/03/06(火) 05:40:47実際に実行してみた?
読むのと実際にやるのじゃ全然違うよ
0855デフォルトの名無しさん
2007/03/06(火) 05:50:43おまえには失望した。
0856デフォルトの名無しさん
2007/03/06(火) 06:08:42………。
0857デフォルトの名無しさん
2007/03/06(火) 06:25:43内容がさっぱりわからない=読んでいる意味が全くない
>>854の言うように読むことに終始するな
まあ、さっぱりわからないとか言っている状態では
ちゃんと読めてるのかも怪しいが…
0858デフォルトの名無しさん
2007/03/06(火) 07:18:40問題
テキストファイルを読み取って(最大で100文字)すべて
アルファベット順に並んだ文字郡のファイルを作る。
またプログラムは、入力ファイルと出力ファイルをユーザーから読み取る。
ヒント(ストリングのアレーを見つけ出す,二次元配列のアレーを使えば
文字を記憶させるのに便利)
0859デフォルトの名無しさん
2007/03/06(火) 07:22:36C/C++の宿題を片付けます 84代目
http://pc11.2ch.net/test/read.cgi/tech/1172981618/
0860デフォルトの名無しさん
2007/03/06(火) 07:44:16どっちかお好みで。
#後者はコーディング規約でポインタ演算を禁じている場合は使えないが。
char * end = strchr(str, '\0');
char * end = str + strlen(str);
自分でループを書くよりも速いコードを用意してある可能性がある。
0861デフォルトの名無しさん
2007/03/06(火) 08:25:56char *end = &str[strlen(str)];
0862デフォルトの名無しさん
2007/03/06(火) 10:51:56彼の言っている事は信用できるのでしょうか?
415 :就職戦線異状名無しさん :2007/03/06(火) 01:26:37
えっと、問題の出題者です。0と1に関して混乱しているようなので回答します。
C言語においては!0は1で保障されています。
そして、if()やwhile()の真偽判定は0か0以外で行います。
具体的にどのような動作になるのかご説明します。
if (!n) foo(); else bar();
のような文があった時、
n=0の場合は
if (!0) foo(); else bar();
if (1) foo(); else bar();
と評価され、foo();の文に制御が移ります。
まとめです
・a>bや!aは、正しい時には1、正しくない時には0と評価される
・ifやwhileの真偽判定は0か非0で行われる
これ以降はプログラム板のC言語なら俺に聞けスレッドでお答えします。
0863デフォルトの名無しさん
2007/03/06(火) 10:59:24答えてもらってるくせに信用できないとかアホか。
そんなに根性捻じ曲がっているなら自分で試せ。
そのぶんだと、誰かが「信用できるよ」って言っても
信じてくれそうにないしな。
0864デフォルトの名無しさん
2007/03/06(火) 11:05:59これも一緒に貼っておけよ
469 名前:就職戦線異状名無しさん[sage] 投稿日:2007/03/06(火) 10:32:23
>>415 デタラメ書くな。
つーか>>415の文章を信じ込んでる奴は確実に落ちるから気をつけろ。
本人が以後はム板でって言ってるからここでは書かないけど
明らかな嘘を本当のように並べ立てるのは感心しない。
おまえ、間違って覚えさせたら責任取れるのかよと。
0865デフォルトの名無しさん
2007/03/06(火) 11:10:20確実なのは試してみることだよ。
0866デフォルトの名無しさん
2007/03/06(火) 11:18:07そもそも!0ってなんだろ?
~0ってことか?
0867デフォルトの名無しさん
2007/03/06(火) 11:19:06論理の否定
ビット反転ではない。
0868デフォルトの名無しさん
2007/03/06(火) 11:25:13すみません、プログラムについては全く知識がなく、
最初は862の文章を見てなるほどそんなものかと納得したのですが
その後に>>864の意見が出たもので、どちらの話が正しいのか混乱してしまいまして・・・
ここにくれば説明があるとの事だったので質問してみました。
0869デフォルトの名無しさん
2007/03/06(火) 11:26:520870デフォルトの名無しさん
2007/03/06(火) 11:33:39そういえばそんな演算子あったな。
!=とかは使うけど!を単独で使った事ないな。
0871デフォルトの名無しさん
2007/03/06(火) 11:35:51C++ の bool を int に昇格させるのに(Windows BOOL 化がほとんどだなw)
return !!hoge;
とかやるよん
0872デフォルトの名無しさん
2007/03/06(火) 11:44:300873デフォルトの名無しさん
2007/03/06(火) 12:00:34えええええ
>>871
えええええええええええええええええええ
0874デフォルトの名無しさん
2007/03/06(火) 12:02:05同意w
0875デフォルトの名無しさん
2007/03/06(火) 12:08:52それはない。
ていうか、キャストもせずにboolのまま否定を2回重ねてもなんの意味もないから。
0876デフォルトの名無しさん
2007/03/06(火) 12:10:44それを言うなら逆じゃないか?
Windows BOOL(int) → C++ bool ならわからんでもないが。
0877デフォルトの名無しさん
2007/03/06(火) 12:11:44!(式)
の(式)部分の結果の否定ということでおk?
0878デフォルトの名無しさん
2007/03/06(火) 12:20:590879デフォルトの名無しさん
2007/03/06(火) 12:25:120880デフォルトの名無しさん
2007/03/06(火) 12:44:27あー 逆だ逆
0881デフォルトの名無しさん
2007/03/06(火) 12:53:350882デフォルトの名無しさん
2007/03/06(火) 14:00:37aが1または2または3の時、という条件文を作りたいのですが、
if( a==1 || a==2 || a==3 )
を
if( a==1 || 2 || 3 )
とすると別の意味になってしまうでしょうか?
if( a==1 || a==2 || a==3 )が長いので、なんとか簡単にできないかなと・・・
0883デフォルトの名無しさん
2007/03/06(火) 14:13:54if( a==1 || 2 || 3 )だとコンパイルは通るけど、常に真が返っちゃうな
aが整数型ならif(a>=1 && a<=3)も可
要素がバラバラで多い時は、switch構文を使うといいかも
switch(a){
case 1:
case 2:
case 4:
case 7:
case 8:
〜処理〜
break;
}
0884882
2007/03/06(火) 14:43:220885デフォルトの名無しさん
2007/03/06(火) 15:23:22規格厨は何ていうか知らないけど概ね間違ってない。
少なくともデタラメなんて事はないな。
0886デフォルトの名無しさん
2007/03/06(火) 16:08:54&&やら==やらの結果が0か1のみになることを保証さ
れてることまでは知らない、という人はよく見かける。
0887デフォルトの名無しさん
2007/03/06(火) 17:30:33処理系に依存しない別の方法は無いのでしょうか
0888デフォルトの名無しさん
2007/03/06(火) 17:41:380889デフォルトの名無しさん
2007/03/06(火) 18:09:56素早いレスありがとうございます。
while(getchar() != EOF)
;
だと、入力待ちになってしまいます。
fgetsを用いた方法は、具体的にどのようなものなのでしょうか。
0890デフォルトの名無しさん
2007/03/06(火) 18:13:16コンソールからの入力が改行コードで終わると仮定して、'\n'まで読み飛ばすしかない
0891デフォルトの名無しさん
2007/03/06(火) 18:23:00ありがとうございます
while (getchar() != '\n')
;
これで出来ました。
0892デフォルトの名無しさん
2007/03/06(火) 18:23:29読み込めたバイト数が一定バイト以下になるまで
0893デフォルトの名無しさん
2007/03/06(火) 18:30:080894デフォルトの名無しさん
2007/03/06(火) 18:45:100895デフォルトの名無しさん
2007/03/06(火) 18:59:53汎用じゃなくてあたりまえな気が
0896デフォルトの名無しさん
2007/03/06(火) 19:23:57最適化で何とかしてくれるのかな。
0897デフォルトの名無しさん
2007/03/06(火) 19:34:19そもそも、stdinから読むならそんなにオーバーヘッドの生じる操作じゃないだろ。
0898デフォルトの名無しさん
2007/03/06(火) 19:35:27最後が改行かどうかチェック。
0899デフォルトの名無しさん
2007/03/06(火) 19:48:230900デフォルトの名無しさん
2007/03/06(火) 20:09:28fgetsを使って書いてみました。
for (;;) {
fgets(buf, sizeof(buf), stdin);
if (strlen(buf) < sizeof(buf) - 1) {
break;
} else if (strlen(buf) == sizeof(buf) - 1) {
if (buf[sizeof(buf) / sizeof(buf[0]) - 2] == '\n') {
break;
}
}
}
これでうまくいきましたが、もっと簡単に書けるのでしょうか。
>>899
fgetsでバッファサイズより大きな文字列を入力したとき、
stdinにゴミが残ってしまうので、このようなことをやっています。
0901デフォルトの名無しさん
2007/03/06(火) 20:29:50reallocでのばせばいいじゃん
0902デフォルトの名無しさん
2007/03/06(火) 20:30:250903デフォルトの名無しさん
2007/03/06(火) 20:31:06まさかそれ、scanf()と組み合わせて使うつもりじゃないだろうな。
0904887=889=891=900
2007/03/06(火) 20:41:24いえ、もちろんfgets()です。
0906デフォルトの名無しさん
2007/03/06(火) 20:57:07これだったら>>891の方式やったほうがいいんじゃね?
0907デフォルトの名無しさん
2007/03/06(火) 21:08:33なんで自前でループまわしてんの
0910デフォルトの名無しさん
2007/03/06(火) 22:21:04何分初心者で大変申し訳ないのですが、教えてください。よろしくお願いします。
0911デフォルトの名無しさん
2007/03/06(火) 22:25:190912デフォルトの名無しさん
2007/03/06(火) 22:26:32質問なら答えてもらえるだろうが、それで解決できるかどうかはお前さん次第だろうよ
0913デフォルトの名無しさん
2007/03/06(火) 22:38:25すみません。
宿題スレを教えていただけないでしょうか・・・。
すみません。
0914デフォルトの名無しさん
2007/03/06(火) 22:39:380915デフォルトの名無しさん
2007/03/06(火) 23:05:580916デフォルトの名無しさん
2007/03/06(火) 23:50:24仮にint=0xFF7Fだとして
1つめの格納する0xFFより上のBYTE型(0xFF00)は右にシフトすればいいだけですが、
2つめの0xFF以下(0x7F)を格納する方法が分かりません。
教えてください。お願いします。
0917デフォルトの名無しさん
2007/03/06(火) 23:54:06ビット積。
0FF7F & 0xFF → 0x007F
0918デフォルトの名無しさん
2007/03/06(火) 23:54:500919デフォルトの名無しさん
2007/03/06(火) 23:55:080920デフォルトの名無しさん
2007/03/06(火) 23:56:08巣に帰れ
http://pc11.2ch.net/test/read.cgi/tech/1170338926/
0921デフォルトの名無しさん
2007/03/06(火) 23:58:250922デフォルトの名無しさん
2007/03/07(水) 00:28:510923デフォルトの名無しさん
2007/03/07(水) 00:39:510924デフォルトの名無しさん
2007/03/07(水) 00:40:20なにも考えずBYTE型にブチ込めば勝手に上位ビットは削れるだろ。
0925デフォルトの名無しさん
2007/03/07(水) 01:11:21sizeof(char) は 1 と規定されているが、
sizeof(char) が 1 のものが 1 byte だとは規定されていない。
0926デフォルトの名無しさん
2007/03/07(水) 01:31:25>−ビットフィールドでない最小のオブジェクト(バイト)に置けるビット数
> CHAR_BIT
とあるのをどう解釈すべきなのか教えて欲しいな。
0927デフォルトの名無しさん
2007/03/07(水) 01:36:490928デフォルトの名無しさん
2007/03/07(水) 01:38:110929デフォルトの名無しさん
2007/03/07(水) 01:48:050930デフォルトの名無しさん
2007/03/07(水) 01:49:020931デフォルトの名無しさん
2007/03/07(水) 01:55:420932デフォルトの名無しさん
2007/03/07(水) 02:31:09実際にBYTE型は規格で定義されていない。それだけだ。
0933デフォルトの名無しさん
2007/03/07(水) 02:46:45たしかに"BYTE型"にたいして規格は沈黙しているが、
byteが定義されている以上、意味論的には
似たようなものにならざるを得まいに。
0934デフォルトの名無しさん
2007/03/07(水) 06:28:52常識的に1バイトだろうとは判断できるが。
0935デフォルトの名無しさん
2007/03/07(水) 09:09:20適当にunsigned charのことだと仮定して話を進めていいだろうに。
0936デフォルトの名無しさん
2007/03/07(水) 09:14:180937質問
2007/03/07(水) 09:36:04int i;
char c[16];
short s;
};
typedef struct test1 {
long l;
double d;
};
int main(void) {
struct test gan;
struct test1 ganba;
printf("%u\n",sizeof(gan));
printf ("%u\n",sizeof(ganba));
return(0);
}
結果24と16になるんですが
メンバーのサイズを全部たしたものにならないのはなぜですか?
0938デフォルトの名無しさん
2007/03/07(水) 09:45:280939デフォルトの名無しさん
2007/03/07(水) 09:47:35答えを言うと、お前の環境のせい
0940デフォルトの名無しさん
2007/03/07(水) 09:51:22ところで、その状況でtypedefする必要は無いと思う
0941質問
2007/03/07(水) 09:59:14ごめんなさい。
まだよくわからないです。
コンパイラが最適化しないならstruct ganは
それぞれのメンバーのサイズを足した大きさを確保するんでしょうか?
構造体の仕組みがよくわからないです。
0942デフォルトの名無しさん
2007/03/07(水) 10:04:51私の環境だと24と12になる。
あと、
sizeof演算子(関数ではない)について
sizeof 型 はカッコが必要だが、sizeof 変数 はカッコ不要。
付けてもいいけど、括弧が付いてると型名かと誤認する人もいるので注意。
typedefについて
型名がないぞ。
typedef struct test { ... } test か、
typedef struct { } test とする。
0943デフォルトの名無しさん
2007/03/07(水) 10:07:30最近のたいていのCPUは4バイトくらいの区切り単位でのアドレスへの
アクセスが高速だったりする。
なので、メンバーのアドレスがCPUにとってアクセスしやすい位置にな
るように途中に詰め物が入るのだよ。
消費メモリ抑止の方向で最適化してコンパイルすることで隙間をなくす
ことも出来るが、速度は一般に遅くなる。
0944デフォルトの名無しさん
2007/03/07(水) 10:09:42#include <stddef.h>
offsetof(構造体型名, メンバ名)
として使うと、先頭から何バイト離れた位置にそのメンバーが
置かれるのかを知ることが出来る。
0945デフォルトの名無しさん
2007/03/07(水) 10:16:13メモリアドレスが4の倍数になっていないと、
メモリというハードウェアの都合で余計な時間がかかったり、
下手するとアーキテクチャによっては読み書きできなかったりする。
そこで例えば4バイトのデータ型のメンバはメモリアドレスが4の倍数になるように置かれる。
これがメモリのアラインメント。ここでは例として4を挙げたが、
アーキテクチャやCPUによってどのようなアラインメントになるかは様々。
struct testはメンバの合計の大きさの合計22が、
test全体の大きさが4の倍数になるように切り上げられて、24になっている。
testの配列を作ったときにアラインメントが合うようにするため。
後ろの2バイトは隙間ということで何もデータは置かれない。
struct test1は8バイトのdoubleが8バイトアラインメントされるよう、
4バイトのlの後ろに4バイト隙間を置いている。
sizeof (short) == 2, sizeof (int) == 4, sizeof (long) == 4, sizeof (double) == 8と推測
0946質問
2007/03/07(水) 10:27:25よくわかりました。
解決できてすっきりしました。
皆さんありがとうございました。
0947デフォルトの名無しさん
2007/03/07(水) 10:47:480948デフォルトの名無しさん
2007/03/07(水) 11:22:08なにをわざわざ。
0949質問
2007/03/07(水) 11:30:45int i;
char c[16];
short s;
}gan;
struct test1 {
double d;
long l;
}ganba;
int main(void) {
struct test1 ganba;
struct test gan;
printf("%u\n",sizeof((struct ganba *)&gan));
printf ("%u\n",sizeof(ganba));
return(0);
}
結果 8と16になります。
この8はどっからきてるのでしょうか?
printf("%u\n",sizeof((struct ganba *)&gan));
これの意味がわからないです。
お願いします。
0950デフォルトの名無しさん
2007/03/07(水) 11:32:30おまえはその前に、そんな邪悪なcastをしてどうしようというのだ。
ちなみに、8はポインタのサイズだろう。
0951デフォルトの名無しさん
2007/03/07(水) 11:37:25} ganba;
と書かれると struct test1型のグローバル変数 ganbaの宣言になる。
なのにそのあとローカル変数として別のstruct test1 ganbaまで出てく
るので何が何だか。
0952質問
2007/03/07(水) 11:39:10unixでこうゆう構造体のキャストがでてきたんですが意味がわからないです。
できるんなら(struct ganba)ganでいいようなきがするのですが。
0953デフォルトの名無しさん
2007/03/07(水) 11:39:56} Ganba;
・
・
Ganba ganba;
0954デフォルトの名無しさん
2007/03/07(水) 11:40:11sizeofはコンパイル時に評価されるから、
sizeof((struct ganba *)&gan)は、
sizeof(struct ganba *)と等価だろう。
しかし、そんなキモイことするな
0955デフォルトの名無しさん
2007/03/07(水) 11:42:03ポインタは相互にキャストできるが、構造体はキャストできん。
0956デフォルトの名無しさん
2007/03/07(水) 11:46:01存在しない型にキャストできるわけがないだろ。よく考えろアホ
0957デフォルトの名無しさん
2007/03/07(水) 11:49:06おまえはそんなコードを読み書きする前に基礎を勉強しろ。
0958質問
2007/03/07(水) 11:49:20考え直してきます。
失礼します。皆さんありがとうございました。
0959デフォルトの名無しさん
2007/03/07(水) 18:18:34もしかしたらC++と混同しているのかもね
0960デフォルトの名無しさん
2007/03/07(水) 18:31:280961デフォルトの名無しさん
2007/03/07(水) 18:34:52俺が今も使ってる
0962デフォルトの名無しさん
2007/03/07(水) 18:35:37#適切なキャストオペレータを用意していれば別だが。
0963デフォルトの名無しさん
2007/03/07(水) 18:37:06新規案件で純粋なC言語っていうのは相当限られてくるね
ただ、C++となるとこれはもう必須みたいなものだし、
そもそも今使われている言語はほとんどC派生言語なので
そういう意味では時代遅れというよりも元祖とか本流みたいなものかと
0964デフォルトの名無しさん
2007/03/07(水) 18:38:23多分、彼のレベルから見て、各種ライブラリのPoint型とかを想像しているのではと思ったのよ
0965デフォルトの名無しさん
2007/03/07(水) 18:38:430966デフォルトの名無しさん
2007/03/07(水) 18:41:07ジャンルによる
多分君が聞きたいのは今目の前で使っているソフトウェアがどの言語で作られているか?ってことじゃないか?
それならほぼ90%はC++で書かれていると思ってもらって構わないよ。
ってか、もう少し質問の仕方を覚えようぜ。
0967デフォルトの名無しさん
2007/03/07(水) 18:41:54まともなC++コンパイラがない不自由な環境もまだまだ在るし、
お客さんが自分で読めないと言う理由でC++を嫌がるケースもあるのよ。
#じゃぁCなら読めるのかと言うと…… まぁ読んだ気はするらしい。
0968デフォルトの名無しさん
2007/03/07(水) 18:41:580969デフォルトの名無しさん
2007/03/07(水) 18:56:24その文字へのポインタを返し、含まれていなければNULLを返す関数
char *str_chr(const char *str, int c) {}
を作成せよ。
という問題で
char *str_chr(const char *str, int c)
{
while(*str) {
if(*str == c)
return str;
str++;
}
return NULL;
}
こう書いたのですが、コンパイルすると
警告 W8075 11-2.c 14: 問題のあるポインタの変換(関数 str_chr )
と言われてしまいます。
何が問題なのか教えて頂けないでしょうか?
0970デフォルトの名無しさん
2007/03/07(水) 19:00:36ST8byte{ unsigned char z[8] } ;
という構造体を作って、その構造体の変数abcを宣言するとします。
ST8byte abc ;
この時、メンバと何かを比較するとしたら
if( abc.z[0] == xyz.z[0] )
みたいになると思うのですが、もしxyzが同じ型だとしたら
if( abc == xyz )
でもできる(メンバ個々の比較ではなく、で全体を比較)でしょうか?
0971デフォルトの名無しさん
2007/03/07(水) 19:00:420972デフォルトの名無しさん
2007/03/07(水) 19:01:49char* から const char* に変換してるからじゃないか?
0973デフォルトの名無しさん
2007/03/07(水) 19:02:47できない。
メンバごとに比較するコードを自分で書くか、
memcmpでメモリイメージが同じか否かを比較する(パディングに何が
入るかわからんので意味がないことが多い)。
http://www.kouno.jp/home/c_faq/c2.html
0974972
2007/03/07(水) 19:03:18返り値型はchar* なのにconst char*なstrを返してるだろ。
そこで警告が出てるんじゃないかと思うんだが
0975デフォルトの名無しさん
2007/03/07(水) 19:07:58つまり、そんな問題を出す阿呆なんか無視してしまえ、ということだ。
0976デフォルトの名無しさん
2007/03/07(水) 19:16:17一応見てみたのですが原因がわからないので質問した次第であります…
>>974
>>975
ありがとうございます〜
確かに返り値にもconstつけたら警告は無くなりました。
とりあえず問題の仕様と言うことで無視します〜。
0977デフォルトの名無しさん
2007/03/07(水) 19:18:08明示的にchar*にキャストするって方法もあるよ。
0978デフォルトの名無しさん
2007/03/07(水) 19:20:17プログラミング言語C ANSI規格準拠 (単行本)
B.W. カーニハン (著), D.M. リッチー (著), 石田 晴久 (翻訳)
これっていい本ですか?
0979デフォルトの名無しさん
2007/03/07(水) 19:26:28その本はK&Rと呼ばれるC言語のバイブルで、持っておくべき本ではあるが、
コンピュータが動く仕組みやプログラミングについて全く未知ならその本だ
けでは挫折する可能性が大。
0980デフォルトの名無しさん
2007/03/07(水) 19:27:27ありがとうございます〜
return (char*)str;
にしたら警告消えました。
0981デフォルトの名無しさん
2007/03/07(水) 19:27:47推薦図書/必読書のためのスレッド PART33
ttp://pc11.2ch.net/test/read.cgi/tech/1167140188/
0982970
2007/03/07(水) 19:42:00ありがとうございます、構造体の比較は各メンバごとにしないといけない
ということは解りました。
構造体の代入はメンバを書かなくてもいいのでしょうか?
上の例で言うと
abc=xyz ;
はOKなのでしょうか
0983デフォルトの名無しさん
2007/03/07(水) 19:48:21代入はOK。メモリのベタコピーで問題ないからな。
ただし、メモリのベタコピーでしかないので、メンバにポインタが
あったりすると、その指している先は共有された状態になってしまう。
これを避けるためには複製するための関数を書かなければならない。
構造体の代入は、現在は言語規格にも規定されているが、実はK&R初版の
頃はできなかった。代入できないということは関数の引数にも出来なかっ
たということだったりする(ポインタを使うしかなかった)。
0984970
2007/03/07(水) 19:56:00ありがとうございましたm(__)m
0985デフォルトの名無しさん
2007/03/07(水) 20:52:46どこが間違ってるのでしょうか・・。
------main.c------
#include <stdio.h>
struct ext_tbl {
int a;
};
struct ext_tbl ext;
main() {
ext.a = 1;
sub();
}
------sub.c------
#include <stdio.h>
extern struct ext_tbl ext;
sub() {
printf("ext.a=%d\n", ext.a);
}
------コンパイル結果------
bash-3.1$ cc -c e1.c
bash-3.1$ cc -c e2.c
e2.c: In function ‘sub’:
e2.c:4: error: invalid use of undefined type ‘struct ext_tbl’
bash-3.1$
0986デフォルトの名無しさん
2007/03/07(水) 20:56:07sub.cがstruct ext_tblを知らないからだ。
struct ext_tbl {
int a;
};
これヘッダファイルにする。
それをmain.cとsub.cで#includeする。
0987デフォルトの名無しさん
2007/03/07(水) 21:03:52できました!ありがとうございます。
このスレサイコーっす。
0988デフォルトの名無しさん
2007/03/07(水) 22:36:22できました!ありがとうございます。
このスレサイコーっす。
0989デフォルトの名無しさん
2007/03/08(木) 00:36:20LISTNODEPTR G=NULL;
int i=0;
/*連結リストの初期化*/
for(i=0; i<((N+1)*N)/2; i++){ //ここが25行目
insert (&G, i+1);
}
return 0;
}
これをコンパイルすると、
maxclique.c: In function `main':
maxclique.c:25: error: parse error before ';' token
maxclique.c:25: error: parse error before ';' token
というエラーが出てきて困ります。
簡単な見落としだと思うんですけど、
文法的な間違いを指摘してください。
0990デフォルトの名無しさん
2007/03/08(木) 00:39:240991デフォルトの名無しさん
2007/03/08(木) 00:40:45#define N 50;
とみた。
0992デフォルトの名無しさん
2007/03/08(木) 00:45:2725行より前にカッコを閉じてない箇所があるのでは?
0993デフォルトの名無しさん
2007/03/08(木) 00:47:560994989
2007/03/08(木) 00:57:59エスパーすごい!
その通り、define文にセミコロン付けてました。
お恥ずかしい。
どうもありがとうございますm(_ _)m
0995デフォルトの名無しさん
2007/03/08(木) 01:00:33多分次のステップではまると思われる箇所
main.h----
int foo(int x)
---------
main.c-----
#include "main.h"
void main(void){
foo(0);
}
----------
0996デフォルトの名無しさん
2007/03/08(木) 01:06:13#defineはプロプロセッサディレクティブ。文じゃねえよ
0997989
2007/03/08(木) 01:08:00.hを自分で作ってincludeしたことってまだないんですが、
こうすればokなんでしょうか?
main.h----
int foo(int x);
---------
main.c-----
#include "main.h"
void main(void){
foo(0);
}
----------
0999デフォルトの名無しさん
2007/03/08(木) 01:09:14まあまあ…
「defineプロプロセッサディレクティブ」って語呂悪いじゃんw
むしろ教えるべきは#から始まる命令は別フェーズで処理されるってことだろう
だから#define関連のミスはコンパイラのエラーメッセージが怪しくなるってことでさ
1000デフォルトの名無しさん
2007/03/08(木) 01:12:40では、エスパーが回答します ↓
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。