>>600 #include <stdio.h>
unsigned char *pack( unsigned char *dst, const unsigned char *src ) {
unsigned char *ret = ( src != NULL ) ? dst : NULL;
while( ( ret != NULL ) && ( *src != '\0' ) ) {
if( ( '0' <= *src ) && ( *src <= '9' ) ) { *dst = 16 * ( *src - '0' ); }
else if( ( 'A' <= *src ) && ( *src <= 'F' ) ) { *dst = 16 * ( *src - 'A' + 10 ); }
else if( ( 'a' <= *src ) && ( *src <= 'f' ) ) { *dst = 16 * ( *src - 'a' + 10 ); }
else { ret = NULL; break; }
src++;
if( ( '0' <= *src ) && ( *src <= '9' ) ) { *dst = *dst + ( *src - '0' ); }
else if( ( 'A' <= *src ) && ( *src <= 'F' ) ) { *dst = *dst + ( *src - 'A' + 10 ); }
else if( ( 'a' <= *src ) && ( *src <= 'f' ) ) { *dst = *dst + ( *src - 'a' + 10 ); }
else { ret = NULL; break; }
src++; dst++;
}
if( ret != NULL ) *dst = '\0';
return ret;
}
int main() {
char buf[20], s[] = "938c8B9e";
pack( buf, s );
printf( "%s\n", buf );
return 0;
}
eval_pv("$s = pack('H*','938c8b9e');",TRUE);
printf("$s = %s\n", SvPV_nolen(get_sv("s",0)));
>>595 void pack( char* dst, const char* src )
{
char buff[ 4 ];
while( (src[ 0 ] != '\0') && (src[ 1 ] != '\0') )
{
strncpy( buff, src, 2 );
if( (*dst = strtol( buff, NULL, 16 )) != 0 )
{
dst += 1;
}
src += 2;
}
*dst = '\0';
}
void pack( char* dst, const char* src )
{
char buff[ 4 ];
while( (src[ 0 ] != '\0') && (src[ 1 ] != '\0') )
{
strncpy( buff, src, 2 );
if( (*dst = strtol( buff, NULL, 16 )) != 0 )
{
dst += 1;
}
src += 2;
}
*dst = '\0';
}
- char buff[ 4 ];
+ char buff[ 4 ] = {0};
607 :
デフォルトの名無しさん:2011/02/21(月) 21:55:06.66
600さんへ、早速の解答有難う御座います。
最初のif文の所は、パスしてしまいました。
機会があったら、試してみます。
604さんへ、こちらの方がコードが少なくてこちらの方は大体は理解出
来ました。要は、longの型に変換すると言う事ですね。こちらは、試し
てきちんと動きました。助かりました。
一番のシンプルさでは、602さんです。
このコードでは、このままでは何かをincludeしないと動かないと思い
ますが、何をincludeしないといけないのかと言うのが分かりません。
これは、詰まりc言語からperlインターフェースを呼んでいるんですよ
ね。これが、簡単で良いとは思いますが、includeするべきヘッダーフ
ァイルは、何処から持って来れば良いのか、分かりません。
602さん、その辺を宜しくお願いします。
>607, 602じゃないが面白そうなのでやってみた
piyo.c
#include <EXTERN.h>
#include <perl.h>
static PerlInterpreter *my_perl;
int main(int c, char **v, char **e) {
char *embedding[] = {"", "-e", "0"};
/* initialize my_perl */
PERL_SYS_INIT3(&c, &v, &e);
my_perl = perl_alloc();
perl_construct(my_perl);
perl_parse(my_perl, NULL, 3, embedding, NULL);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
perl_run(my_perl);
/* evaluate Perl statments */
eval_pv("$s = pack('H*', '938c8b9e');", TRUE); /* S-JIS */
printf("$s = %s\n", SvPV_nolen(get_sv("s", 0)));
/* finalize my_perl */
perl_destruct(my_perl);
perl_free(my_perl);
PERL_SYS_TERM();
return 0;
}
cc -Wall -o piyo piyo.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
http://perldoc.jp/docs/perl/5.10.0/perlembed.pod#Evaluating32a32Perl32statement32from32your32C32program
eval_pv は独立した Perl の文字列を評価し、強制的に C の型へと 変数を展開します。
へー
知らなかった
610 :
デフォルトの名無しさん:2011/02/22(火) 02:35:21.35
[1] 授業単元: プログラミング
[2] 問題文 サッカーの試合結果の記録されたデータファイルを読み取り、
優勝したチーム名を出力するプログラムを作成せよ。
データファイルには、先頭の行にチーム数が出力されており、
2行目からチーム名(チーム数分)、
それ以降の行に試合結果が出力されている。
試合結果の行は以下のフォーマットとなっている。
<ホーム側のチーム名> <ホーム側チームの得点>
<アウェイ側チームの得点> <アウェイ側チーム名>
チーム名は30文字以内とする。
試合に勝ったチームには勝ち点3が与えられ、引き分けたチームには
勝ち点1が与えられる。勝ち点の合計が最も多いチームが優勝となるが、
勝ち点の合計が同じチームが複数ある場合には、それらのうち、
得失点差(得点と失点の差)の合計が大きいチームが優勝となる。
得失点差の合計が同じ場合にはどちらを優勝としてもよい。
4
MANCHESTER_UNITED
ARSENAL
CHELSEA
LIVERPOOL
MANCHESTER_UNITED 3 1 ARSENAL
CHELSEA 3 0 LIVERPOOL
ARSENAL 2 2 CHELSEA
LIVERPOOL 3 0 MANCHESTER_UNITED
------------------------------------
[3] 環境
[3.1] Windows
[3.2] visual 2008
[3.3] 言語: C++
[4] 期限: 2011年2月23日午前8時
[5] その他の制限: 初心者で現在条件分岐までならっているのですがこの問題はは
初心者には難しいでしょうか?よろしくお願いします。
>>610 条件分岐までしか進んでないのにファイル入力や二次元配列 or 構造体配列が必要な宿題を出すのか?
もし自分の独習用なら少し早いかも知れないね
まぁ調べながらコードを書くのは良い勉強になるからダメもとで書いてみるのは良いと思うけど
foo.exe << bar.txt
のようにすればcinでもいいので
そういうのを想定してるのかもよ
そのままでは、エラーになるので、多分ライブラリーが無いと思われるのだが。
下記で、調べようと思って、下記のコマンドを実行したら、下記のメッセージが出た。
これは、何を意味しているのだろうか。ヘッダーファイルが無いと言う事なのだろうか。
バージョンは確かにこの通りに4.3.2にはなっています。
済みません。宜しくお願いします。
おそらく、さらにライブラリを追加指定する必要があるでしょう。 どれを? おそらく以下のようにすれば表示されます:perl -MConfig -e 'print $Config{libs}'
Set up gcc environment - 4.3.2
-lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lmsvcrt
そのperlコマンドを実行し、コンパイル時にそれらのリンカオプションをつけてみろってことなんでないのかな
>>614 良く分からんが、perlをコンパイルすると、perlライブラリが出来るらしい
で、そのコマンドは出来上がったライブラリがどこにあるか調べるコマンドだって
シリアル通信の質問したものですが学校の制限のせいでAPIが制限されていただけのようです
課題は何とかなりそうです。リンクを張ってくれた方ありがとうございます
ところで制限のかかったアカウントで管理者のユーザーとして立ち上げたVisual studioで作ったプログラムから
管理者権限でプログラムを起動するのは可能ですか?
素人なのでよくわかりません。
環境に依存しなさそうな方法が、ショートカットを作って管理者権限を要求するように設定する方法
Vista以降ならシールドアイコンつける
[1] プログラミング言語
[2]問題文 以下のソースプログラムで誤っている箇所(○行目の〜の部分)とそれを
どのように修正すればよいのかを指摘しなさい。誤っている箇所は複数あるので、以下の
例のように箇条書きにして、誤っている部分と修正安を指摘してください。(一箇所の指摘に対して1点、最大5点まで加点)
(箇条書きの例)
・9行目の「kekka =10;」で、合計を求める変数kekkaの初期化が正しく行われていない。
「kekka = 0;」とすべき。
・○行目の〜の部分で・・・・・など。
2つの整数を引数として受け取り、第一引数と第2引数の足し算の結果(整数)
を戻り値とする関数をsumという関数名で作成せよ。さらに、関数sumを利用して、以下の
配列numberの10個の数値の合計値を求めるプログラムを作成せよ。
int number[10]={1,2,3,4,5,6,7,8,9,10};
[3] 環境
[3.1] linuxのkateです。
[3.3] C言語
[4] 期限: 2011年の2月26日の12時です。
[5] その他の制限: 特にないと思います。お手数かけますがどなたかお願いします。
イカソースがないじゃないか
ソースはこちらになります。
#include<stdio.h>
int sum(int arg1, int arg2)
int main(void)
{
int number[10]={1,2,3,4,5,6,7,8,9,10};
int kekka, i;
kekka = 10;
for (i=1; i<=10; i++)
{
kekka = su(kekka, number[i]);
}
printf("%d\n", &kekka);
return 0;
}
sum(int arg1, int arg2)
{
return = arg1 + arg2;
}
じ、字下げが反映されてない・・・orz
字下げはちゃんとされてる設定です!
>>622 いくら宿題だとはいえ、こんなソース見た瞬間に0から書き直すことを考える。
一応書いておくと8箇所か9箇所かな…
int sum(int arg1, int arg2);
2行目。末尾に終端記号 ; を付加
kekka = 0;
9行目。例に従い初期値を0とする
for (i=0; i<=9; i++)
10行目。初期値及び終了条件をnumber配列の添え字の範囲に変更
kekka = sum(kekka, number[i]);
12行目。関数名の間違い
printf("%d\n", kekka);
14行目。& は不要
return arg1 + arg2;
21行目。= は不要
>>625 すいません。人に物を頼むのに適当なことやって
書き直します!
#include<stdio.h>
int sum(int arg1, arg2)
int main(void)
{
int number[10]={1,2,3,4,5,6,7,8,9,10};
int kekka, i;
kekka =10;
for(i=1; i<=10; i++)
{
kekka = sum(kekka,number[i]);
}
printf("%d\n", &kekka);
return 0;
}
sum(int arg1, int arg2)
{
return = arg1 + arg2;
}
何故さがらない・・・・orz
>>626 ありがとうございます。
12行目は自分の打ち込みミスでした・・・
ほんとすいません。
凄く助かりました。
>for (i=0; i<=9; i++)
マジックナンバー (・A・)イクナイ!
for (i=0;i<sizeof(number)/sizeof(number[0]);i++)
ループで毎回計算させるのもイクナイ!
>>631 嘘つけ、コンパイル時に定数決定される。あれ?もしかすると釣りか?
まぁ、マジックナンバーは「誤っている」とまでは言えないわな。
sum(int arg1, int arg2) も返却値の型 int を明示すべきだが
規格ではエラーではない(ここでは int と推測されてプロトタイプに一致する)。
2行目が何気に変わってるのも釣りなのかな…?
>int sum(int arg1, arg2)
何気に
kekka = sum(kekka,number[i-1]);
で
for (i=1; i<=10; i++)
は正しいのかも知れない…
>>628 以前はダメだったんだけど、最近は tab インデントは下がるはずだよ
空白でインデントしていないかい?
もしくは専ブラとかが関係してるのかな?
#include<stdio.h>
int main() {
printf( "%s\n", "
>>636 そうなのか?" );
return 0;
}
駄目じゃん
>>635 ああ!2行目も打ち間違えてた・・・orz
正式には
int sum(int arg1,int arg2)
です。
>>636 tabキーですか!
一回目の書き込みは専ブラからで
二回目は直で書き込んだんですけど
どちらも駄目で焦りましたw
>>639 アンカーも間違ってるみたいだけど気にするなwww
>>640 hahaha...
もう駄目ですねwww
死んだほうがいい俺wwww
#include <stdio.h>
int main( void )
{
printf( "下がってない?\n" );
}
643 :
642:2011/02/26(土) 04:07:28.19
エディターで書いてコピペすれば下がるみたい
ちなみにギコナビ使ってる、ギコナビだと直打ちするにも tab が入らない
>>643 それギコナビがtabを ×4に置き換えてくれてるだけでは無かろうか?
>>644 どうやらそうみたいだね、今 chrome で同じ事しようとしたら確認画面の段階でダメだったよ
以前はギコナビでもダメだった記憶が有るんだけど、バージョンアップしたっけか?
ちなみに現在はバタ61です
[1] 授業単元: データ構造とアルゴリズム
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語:C言語
[4] 期限: ([2011年2月28日18:00まで]
問題1
「与えられた浮動小数点データより平均値を求め、その値を出力せよ。」という課題プログラムを、
線形リストを用いたC 言語プログラムで実現することを考える。
(1) 用いる構造体、および、処理関数Heikin を作成せよ。ただし、引数として「データ入力済み
の線形リスト」のみが渡されるものとし、演算結果を戻り値で処理せよ
(2) 処理すべき浮動小数点データがバイナリでファイルfile1 に格納されているものとする。この
file1 から浮動小数点データを読み込み、線形リストを作成する処理部分を記述せよ。
647 :
646:2011/02/27(日) 12:41:01.03
よろしくお願いします。
お手上げです。
649 :
646:2011/02/27(日) 14:03:21.01
650 :
デフォルトの名無しさん:2011/03/03(木) 03:28:29.46
[1] 授業単元:C言語でアクションゲーム制作
[2] 問題文:@キーを取得し,プレイヤーを操作できるようにする
ボタン入力でプレイヤーから弾を発射できるようにする
A乱数で座標を取得し,乱数で画面右から飛来する敵を設定
B敵と弾の当たり判定を作成。プレイヤーに当たったら死亡
弾が当たったら描画を消す。
[3] 環境
[3.1] OS:Windows
[3.2] バージョン:Visual studio2008
[3.3] 言語:C言語
[4] 期限:3月5日
[5] その他の制限:DirectXは使用しない
敵の作成と当たり判定で詰んでます・・・
よろしくお願いします。
>>650 2Dなら当たり判定は円同士(3Dなら球同士)が楽でいいんじゃね?
2つの円の距離が半径の合計より小さければ当たったってことで。
float player_x, player_y, player_r;
float enemy_x, enemy_y, enemy_r;
float length_x, length_y, length_r;
length_x = enemy_x - player_x;
length_y = enemy_y - player_y;
length_r = player_r + enemy_r;
if( ((length_x * length_x) + (length_y * length_y)) < (temp_r * temp_r) )
{
// 当たった
}
ただ高速に移動するもの同士だとすり抜けが起こるから
気になるようなら弾は直線で判定するといいかもね。
652 :
デフォルトの名無しさん:2011/03/03(木) 21:09:32.56
[1] 授業単元: デジタル信号処理
[2] 問題文: 次のC言語構造体練習用コード
(
ttp://www1.axfc.net/uploader/Sc/so/210923)
を参考にしてQuaternion一次方程式{Ax+B=0, xA+B=0}の解を計算するプログラムを作れ。
[3] 環境
[3.1] OS: MacOSX
[3.2] コンパイラ名とバージョン: gcc4.2
[3.3] 言語: C
[4] 期限: 3月9日
653 :
652:2011/03/03(木) 21:12:12.11
連続post申し訳ないです。。。
連立多元一次方程式の解法は種々ありますが、この形は初めてで手がつけられません。よろしくお願いします。
四元数の計算ルーチンが揃ってるんだからガウス法か掃き出し法ですぐ解けるだろ
交換法則が成り立たない場合があるのでそれだけ気を付ければいいみたいだな
[1] 授業単元: C言語プログラミング
[2] 問題文
任意の正の実数同士の割り算を30ケタまで正確に出力するプログラムを作成せよ。
例 1/3=0.3333333333333・・・・・333
[3] 環境
[3.1]Windows7
[3.2]gcc
[3.3]C言語
[4]明日のAM7:00
[5] その他の制限:なし
>>656 >任意の正の実数
何億桁とかもおkなの?
>30ケタまで正確に出力するプログラム
小数点以下30桁?値全体の桁が30?まさか小数点を抜くと29桁ってこと?
>>657 すいません、情報が少なすぎました。
任意の実数、そうですね、0<x<10000程度でお願いします。
30桁とは、小数点以下が30桁です。
おねがいします
>>659 じゃぁ実数はint型でお願いします。
34/4
1000/23
みたいな感じの出力が知りたい。
とにかく知りたいのが出力なんで・・・
Cスレで騒いでるキチガイか
相手すんな
>>660 #include <stdio.h>
int main( void )
{
int a = 1000, b = 23, c, d, i;
c = a / b;
d = a % b;
printf( "%d.", c );
for( i = 0; i < 10; i++ ) {
a = d * 1000;
c = a / b;
d = a % b;
printf( "%03d", c );
}
printf( "\n" );
return 0;
}
こんな感じ?
入力を実数にするのはちょっと面倒だな
663 :
662:2011/03/03(木) 23:13:52.86
補足:
適当に3桁づつ処理したけど、入力によっては駄目な場合が有るね
5桁くらいが適当かな
for( i = 0; i < 6; i++ ) {
a = d * 100000;;
c = a / b;
d = a % b;
printf( "%05d", c );
}
に直してちょ
>>662 やっぱり技巧でするんですか・・・
割り算じゃなくて、例えば
int 型だと
9000から1ずつ増やしていったら、9001・・・9997・・・9998・・・9999 10000
とちゃんと正確に出ますよね?
なのに、なんでfloatは
1.0000にならないといけないのに、0.9989とかなるんですか?
665 :
デフォルトの名無しさん:2011/03/04(金) 00:24:30.59
>>651 円で考えてやったら出来ました!
ありがとうございました。
>>664 技巧の意味は解らんが有効数字30桁を扱える型が無い以上、あんな方法しか無いだろう
1.0 が 0.9989 にはならんだろ、釣りか?
相手にすんなって警告したのに
浮動小数点型の丸め誤差と桁落ちについて調べなおしたほうがいい
プログラミング以前の常識だと思うんだけど間違いなのかな
そりゃ宿題スレで質問するぐらいなんだから初心者なんでしょ。
初心者の質問を気違いだと捨てる人の度量のなさに驚くわ。
もしくは答えられないのか。
あんたが答えてやれよwww
もう答えられてるじゃん。どうしたの?
>>656 こんなん1桁づつ計算したらいいだけじゃん
今 codepad.org 繋がる?
>最終的には高速フーリエ変換等の高速化が必須となる。
はいはい博識乙^^
博識?ユニバーサルメルカトルをつかうのが常識じゃないか?
679 :
デフォルトの名無しさん:2011/03/06(日) 06:57:34.47
[1] 授業単元:C言語の機能
[2] 問題文: タイマーを作成,30秒から0秒まで表示せよ
WAIT(1000);とおくと1秒経過します。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:Visualstudio2007
[3.3] 言語: C言語
[4] 期限: 3月6日
デジタル時計のような感じです。
30が表示され,1秒後に同じ場所に29が表示されていく感じです
よろしくお願いします。
>>679 int i;
for(i=30;i>=0;i--){
system("cls");
printf("%d",i);
WAIT(1000);
}
>>679 Visual Studio 2007なんて見たことないから、
動作確認できないが、基本的にWindows系ならこれでOK
int main() {
int i;
for( i = 30 ; i >= 0 ; i-- ){
printf( "%2d\r", i );
WAIT(1000);
}
return 0;
}
683 :
682:2011/03/07(月) 00:53:37.22
タイマー処理で誤差が大きくならない仕様に汁って話なら正しいコンパイラを
誤差ならWAITを先にしたほうがいいんじゃね
って思ったけどたいした差じゃないか
正しいコンパイラって?
>>685 > [3.2] コンパイラ名とバージョン:Visualstudio2007
2007なんてあるのか?
2005または2008で書いたらどうなるわけ?
1900とか2100とか書いたらどうなるの?
年代物の価値が出る?
クロックが可変なCPUや、マルチの場合、どうなるかは良く分からん
#include <stdio.h>
#include <windows.h>
int main() {
int i;
LARGE_INTEGER clock, st, tm;
long long cd[31];
QueryPerformanceFrequency( &clock );
QueryPerformanceCounter( &st );
for( i=0; i<31; i++ ) {
cd[i] = st.QuadPart + clock.QuadPart * ( i+1 );
}
for( i=0; i<31; i++ ){
while( 1 ) {
WAIT(1); // 精度を上げたければ、この行を削除
QueryPerformanceCounter( &tm );
if( cd[i] < tm.QuadPart ) {
printf( "%2d\r", 30-i );
break;
}
}
}
return 0;
}
それは正しいコンパイラですか?
いいえ、それはトムです
はい、インテル入ってます
>>689 なぜ素直に clock() を使わない
精度がワロス
>>693 > QueryPerformanceCounter( &tm ); // ここから
> if( cd[i] < tm.QuadPart ) {
> printf( "%2d\r", 30-i ); // ここまでの処理を出来るだけ短い時間、かつ、一定の処理速度に
clock()使うとvc++のclock()の実装処理に依存してしまうから
CLOCKS_PER_SEC も併用すれば解決じゃね?
697 :
デフォルトの名無しさん:2011/03/07(月) 21:06:44.64
[1] 授業単元: C言語入門
[2] 問題文(含コード&リンク):
問1
サイコロをN個、振って、全てのサイコロが同じ数の目が出るまでにかかった
処理時間を表記する。1〜100回など切りの良い個数まで全て計測し、出力形式
N=1 x秒
N=2 y秒
・
・
N=100 z秒
の形式で出力する。
[3] 環境
[3.1] Windows7
[3.2] gcc
[3.3] C
[4] 3月8日 午前7:00
[5] その他の制限: 出力端末:cygwinの画面、エディター:メモ帳
>>697 サイコロの振り方に関する注文はないのか?
700 :
デフォルトの名無しさん:2011/03/07(月) 21:10:08.81